32a41bde6d
- 新增 WechatJsapiStrategy(WECHAT):wechatpay-java JsapiServiceExtension.prepayWithRequestPayment
返回 wx.chooseWXPay 所需参数;带 openid 走 JSAPI,否则回退 Native 扫码
- PaymentServiceImpl.getPaymentStrategy:WECHAT 按 openid 有无分流 JSAPI/Native
- HjcOrderController.pay:读取 openid,改用 WECHAT 类型
- 新增 HjcWechatController:/authorize 生成公众号授权地址、/oauth/callback code换openid回跳、
/jsapi-sign 生成 wx.config 签名(jsapi_ticket,公众号配置存 redis cache{tenantId}:setting:wx-official)
- ADR 0003 记录 JSAPI 决策
1.7 KiB
1.7 KiB
H5 端(公众号内)支付采用微信 JSAPI 直接唤起
汇吉采移动端 H5(hjc-h5,在微信「公众号」内打开)的支付采用微信 JSAPI(PaymentType.WECHAT + openid),由后端 WechatJsapiStrategy 用 wechatpay-java 的 JsapiServiceExtension.prepayWithRequestPayment 直接返回前端 wx.chooseWXPay 所需的 appId/timeStamp/nonceStr/package/signType/paySign;无 openid(非公众号环境)时回退 Native 扫码展示 codeUrl。
选择理由:公众号内直接「唤起支付」免去另开微信扫二维码的操作,转化率与体验均优于 Native 扫码;后端支付组件(PaymentRequest.openId、PaymentResponse.wechatJsapi、PaymentChannel.WECHAT_JSAPI、WechatPayType.JSAPI)早已为 JSAPI 预留,只差一个策略实现,改造成本低。
代价/偏离:
- 需要用户 openid,因此引入微信网页授权(静默
snsapi_base):/hjc/wechat/authorize生成授权地址,/hjc/wechat/oauth/callback用code换openid后回跳 H5 并附带openid。 - 需要
wx.config签名:新增/hjc/wechat/jsapi-sign(基于jsapi_ticket做 SHA1 签名),公众号配置(appId/appSecret)存于 Rediscache{tenantId}:setting:wx-official。 - 不改 Native 扫码逻辑:两者共用同一商户号/回调地址;
PaymentServiceImpl.getPaymentStrategy在WECHAT类型下按openid有无分流 JSAPI/Native,未破坏既有 Native 调用方。
兼容与说明:本方案是「带 openid 走 JSAPI,否则 Native」的弹性分流,非公众号环境(如普通浏览器/开发联调)仍可扫码支付,便于无真实公众号配置时验证。