微信小程序后端某次尝试开发

用户登录态的获取

前端使用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其实就是封装好的操作)

拿统一下单接口为例。

  1. 小程序前端调用方法唤起支付,后端写业务逻辑,例如充值之类的。
  2. 调用统一下单api,返回预付单的信息。
  3. 然后组合数据进行签名。
  4. 将支付参数再返回给前端,然后当用户确认支付后(这一步是直接与微信后台交互),然后返回支付结果,前端展示支付接口。
  5. 然后后端的推送回调地址内做后端数据确认支付的逻辑。

签名的逻辑算法。微信团队都有开源。

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 统一下单的代码。
// 实际上也就是将复杂的配置帮我们简化了~

发表评论

电子邮件地址不会被公开。 必填项已用*标注