在 CheckoutController 的 pay 方法里可以得到从小程序那里发送过来的 code,就是登录用的凭证 .. 现在我们再去请求获取到用户的 openid ..
在之前做公众号支付的课程里,我们是在这个控制器的 render 方法里,获取到的登录凭证,还有用户的 openid ..
这个方法里的代码在这个课程里已经用不到了 .. 所以可以把它们都删除掉 ...
然后再回到 pay 这个方法 ... 在这里可以去请求得到用户的 openid .. 代码可以单独放在一个方法里面 .. 这个方法返回的应该是微信用户的会话 .. 添加一个 wxSession .. await .. 等待执行 this.prePay 这个方法的结果 .. 再把上面得到的 code 交给这个方法 ..
再找个地方可以定义一下 prePay 这个方法 ..
async .. prePay .. 方法接收一个 code 参数 ..
在它里面,需要先准备一些数据,然后再去请求一个地址来获取到微信用户的会话信息 .. 需要 appid .. 它的值应该是小程序的 id 号 .. 它的值我已经放在应用的配置里了 .. 这里用一下 Config.get 得到 wxapp 配置文件里的 appid 这个配置 ..
再添加一个 secret ,它是小程序的密钥 .. Config.get ,得到 wxapp 里的 secret ..
还需要一个 js_code .. 它的值应该是 code ,就是登录凭证 ..
还得再添加一个 grant_type .. 把它的值设置成 authorization_code ..
然后再去创建一个对象,组织一下需要的参数数据 .. 名字是 jsCodeToSessionParams .. 里面添加一个 appid, secret, js_code ,还有 grant_type ..
再把这个对象转换成地址查询符字符串 .. 名字是 jsCodeToSessionString .. 用一下 queryString 的 stringify 方法处理一下 jsCodeToSessionParams ..
请求的地址是 jsCodeSessionApi .. 这个接口地址可以放在配置里面 .. Config.get 得到 weixin.api.jsCodeToSession 的值 ..
打开 config 下面的 weixin.js .. 在 api 这里,再添加一个 jsCodeToSession .. 接口地址的值是 https://api.weixin.qq.com/sns/jscode2session
回到控制器 .. 再组织一下最终要请求的地址 .. 名字是 jsCodeToSessionUrl .. 地址需要 jsCodeToSessionApi .. 问号 .. 还需要一些查询符形式的数据 .. 这里就是 jsCodeToSessionString ..
请求这个地址得到的响应可以叫 wxResponse .. await ,等待执行请求的结果 .. axios 的 post .. 请求的地址是 jsCodeToSessionUrl ..
请求成功获取到的就是微信用户的会话 .. wxSession .. 具体的数据是在 wxResponse 里的 data 这个属性里面 ..
最后再返回得到的这个 wxSession .. 在它里面会包含微信用户的 openid ..
然后再回到 pay 这个方法 .. 可以把得到的 wxSession 输出到应用的日志里面检查一下 .. logger.debug .. 输出 '微信用户会话:' wxSession ..
打开应用的日志 .. app.log .. 先清空一下这个文件里的内容 ..
预览
下面可以再到小程序上去试一下 .. 按一下 确认支付 ...
再回到应用 ..
这里你会发现,请求获取到的微信用户的会话信息 .. 在支付的时候我们需要用的是这里的 openid ...