Files
mp-java/docs/adr/0003-h5-wechat-jsapi-payment.md
weicw1996 32a41bde6d feat(hjc): 支持公众号H5 JSAPI支付 + 微信网页授权/JS-SDK签名
- 新增 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 决策
2026-09-09 16:38:16 +08:00

1.7 KiB
Raw Permalink Blame History

H5 端(公众号内)支付采用微信 JSAPI 直接唤起

汇吉采移动端 H5hjc-h5,在微信「公众号」内打开)的支付采用微信 JSAPIPaymentType.WECHAT + openid),由后端 WechatJsapiStrategywechatpay-javaJsapiServiceExtension.prepayWithRequestPayment 直接返回前端 wx.chooseWXPay 所需的 appId/timeStamp/nonceStr/package/signType/paySign;无 openid(非公众号环境)时回退 Native 扫码展示 codeUrl

选择理由:公众号内直接「唤起支付」免去另开微信扫二维码的操作,转化率与体验均优于 Native 扫码;后端支付组件(PaymentRequest.openIdPaymentResponse.wechatJsapiPaymentChannel.WECHAT_JSAPIWechatPayType.JSAPI)早已为 JSAPI 预留,只差一个策略实现,改造成本低。

代价/偏离:

  • 需要用户 openid,因此引入微信网页授权(静默 snsapi_base):/hjc/wechat/authorize 生成授权地址,/hjc/wechat/oauth/callbackcodeopenid 后回跳 H5 并附带 openid
  • 需要 wx.config 签名:新增 /hjc/wechat/jsapi-sign(基于 jsapi_ticket 做 SHA1 签名),公众号配置(appId/appSecret)存于 Redis cache{tenantId}:setting:wx-official
  • 不改 Native 扫码逻辑:两者共用同一商户号/回调地址;PaymentServiceImpl.getPaymentStrategyWECHAT 类型下按 openid 有无分流 JSAPI/Native,未破坏既有 Native 调用方。

兼容与说明:本方案是「带 openid 走 JSAPI,否则 Native」的弹性分流,非公众号环境(如普通浏览器/开发联调)仍可扫码支付,便于无真实公众号配置时验证。