用户登录态的获取
前端使用wx.login会唤起用户确认登录。 此时拿到一个code,那么此时,我们后端要干什么,我们需要记录用户的用户态 在后端~ 我们拿到了前端的code之后 在后端调用 https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code api接口 用来与微信小程序server端兑换用户信息。 由于我们这个请求在后端发送,所以也不用怕被泄漏商户信息
拿到标识后
在拿到了之后 session_key 会话秘钥 openid unionid 微信小程序前端checkSession 可以检查用户是否登录态过期。 后端派发用户态有很多,现在比较常见的应该是jwt,OAuth 我们把openid unionid作为用户标记存在我们的数据库中 用户做了什么操作都记录openid。 这里的openid有点像用户正常登陆后根据id派发的。 只是中间加了一层服务端api请求获取罢了。 相当于是微信用户特有标识,我们拿到了再做一层自己用户态的封装 如果原本网站已经有用户了,在做用户态的关联,只要用户某些特有属性做关联,eg:phone number
微信支付
微信支付的话常用的有我们说的统一支付接口。 网上也有不少整合的sdk。如果调用sdk的话步骤可谓是相当简单 首先前端请求payment支付。 在前端生成了对应的支付页面
在点击的那一刻
将对应的请求发送给后端。 后端拿到了。 例如支付金额,订单详情之类的。 至于用户信息,可以使用我们派发的登录态。 对jwt解码拿出我们封装在内的用户信息 在后端拿到对应信息的时候,要对应做业务逻辑的处理,例如是余额支付/在线支付等等,这一层应该也是没问题的 (sdk其实就是封装好的操作)
拿统一下单接口为例。
- 小程序前端调用方法唤起支付,后端写业务逻辑,例如充值之类的。
- 调用统一下单api,返回预付单的信息。
- 然后组合数据进行签名。
- 将支付参数再返回给前端,然后当用户确认支付后(这一步是直接与微信后台交互),然后返回支付结果,前端展示支付接口。
- 然后后端的推送回调地址内做后端数据确认支付的逻辑。
签名的逻辑算法。微信团队都有开源。
public static function unifiedOrder($inputObj, $timeOut = 6)
{
$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
//检测必填参数
if(!$inputObj->IsOut_trade_noSet()) {
throw new WxPayException("缺少统一支付接口必填参数out_trade_no!");
}else if(!$inputObj->IsBodySet()){
throw new WxPayException("缺少统一支付接口必填参数body!");
}else if(!$inputObj->IsTotal_feeSet()) {
throw new WxPayException("缺少统一支付接口必填参数total_fee!");
}else if(!$inputObj->IsTrade_typeSet()) {
throw new WxPayException("缺少统一支付接口必填参数trade_type!");
}
//关联参数
if($inputObj->GetTrade_type() == "JSAPI" && !$inputObj->IsOpenidSet()){
throw new WxPayException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!");
}
if($inputObj->GetTrade_type() == "NATIVE" && !$inputObj->IsProduct_idSet()){
throw new WxPayException("统一支付接口中,缺少必填参数product_id!trade_type为JSAPI时,product_id为必填参数!");
}
//异步通知url未设置,则使用配置文件中的url
if(!$inputObj->IsNotify_urlSet()){
$inputObj->SetNotify_url(WxPayConfig::NOTIFY_URL);//异步通知url
}
$inputObj->SetAppid(WxPayConfig::APPID);//公众账号ID
$inputObj->SetMch_id(WxPayConfig::MCHID);//商户号
$inputObj->SetSpbill_create_ip($_SERVER['REMOTE_ADDR']);//终端ip
//$inputObj->SetSpbill_create_ip("1.1.1.1");
$inputObj->SetNonce_str(self::getNonceStr());//随机字符串
//签名
$inputObj->SetSign();
$xml = $inputObj->ToXml();
$startTimeStamp = self::getMillisecond();//请求开始时间
$response = self::postXmlCurl($xml, $url, false, $timeOut);
$result = WxPayResults::Init($response);
self::reportCostTime($url, $startTimeStamp, $result);//上报请求花费时间
return $result;
}
// 这是php sdk 统一下单的代码。
// 实际上也就是将复杂的配置帮我们简化了~