WeChat Pay Server To Server 集成
WeChat Pay-Server To Server交互流程
集成导航
Step1 调用下单并支付
使用下单并支付接口直接发起微信支付
Request Body Parametersapplication/json
Response Body Parametersapplication/json
Request Body Parametersapplication/json
Response Body Parametersapplication/json
Request Body Parametersapplication/json
Response Body Parametersapplication/json
QRCode
Android
iOS
Step2 处理支付响应
根据不同支付场景处理返回的支付参数:
关键参数说明:
device.orderTerminal
- 02-PC端浏览器(pc)
- 04-SDK(ios)
- 05-SDK(Android)
shopperIP
- 用户的公网IP地址,微信支付要求必须传递,否则会报错
- 请获取真实的消费者IP地址,不能使用localhost、127.0.0.1等回环地址
Request Body Parametersapplication/json
Response Body Parametersapplication/json
Request Body Parametersapplication/json
Response Body Parametersapplication/json
Request Body Parametersapplication/json
Response Body Parametersapplication/json
QRCode
Android
iOS
PC端支付
device.orderTerminal = 02
下单并支付接口返回参数:
qrCode: 微信的qrCode,需要商户自行处理二维码展示paymentRedirectUrl: PingPongCheckout包装的二维码页面,只需要重定向到该页面
移动端浏览器支付
device.orderTerminal = 04 或 05
下单并支付接口返回参数:
paymentRedirectUrl: 对应微信的mwebUrl参数
Webview内支付
device.orderTerminal = 04 或 05
下单并支付接口返回参数:
paymentRedirectUrl: 对应微信的mwebUrl参数
方案1:Webview直接拉起微信支付
请求下单并支付接口,获取
paymentRedirectUrl。设置 Referer
Android:在 loadUrl 时添加 Referer
val headers = mutableMapOf<String, String>() headers["Referer"] = "https://your-domain.com" // 必须与授权域名一致 webView.loadUrl(mwebUrl, headers)iOS:在 request 头中设置 Referer(WKWebView)
guard let url = URL(string: mwebUrl) else { return } var request = URLRequest(url: url) request.setValue("https://your-domain.com", forHTTPHeaderField: "Referer") webView.load(request)拉起微信并支付
方案2:通过中间页拉起为微信支付
请求下单并支付接口,获取
paymentRedirectUrl。创建 pay-proxy 中间页
<!-- https://中间页域名/pay-proxy --> <script> (async () => { const { mweb_url } = await fetch('/api/getMwebUrl', { method: 'POST', body: JSON.stringify({ orderId: getQuery('orderId') }) }).then(r => r.json()); const redirect = encodeURIComponent( `https://中间页域名/back?orderId=${getQuery('orderId')}` ); location.replace(`${mweb_url}&redirect_url=${redirect}`); })(); </script>创建 back 回调页
<!-- https://中间页域名/back --> <script> location.replace( `yourapp://payResult?orderId=${getQuery('orderId')}&result=${getQuery('result')}` ); </script>App WebView 加载中间页
webView.loadUrl("https://中间页域名/pay-proxy?orderId=123")拦截并拉起微信
override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean { val url = request?.url?.toString() ?: return false if (url.startsWith("weixin://")) { startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url))) return true } if (url.startsWith("yourapp://")) { handlePayResult(url) return true } return false }接收回跳并刷新订单
在handlePayResult(url)中解析参数,关闭 WebView,查询后端订单状态。
