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

13 lines
1.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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)存于 Redis `cache{tenantId}:setting:wx-official`
- **不改 Native 扫码逻辑**:两者共用同一商户号/回调地址;`PaymentServiceImpl.getPaymentStrategy``WECHAT` 类型下按 `openid` 有无分流 JSAPI/Native,未破坏既有 Native 调用方。
兼容与说明:本方案是「带 openid 走 JSAPI,否则 Native」的弹性分流,非公众号环境(如普通浏览器/开发联调)仍可扫码支付,便于无真实公众号配置时验证。