WeChat Pay Server To Server Integration
WeChat Pay-Server To Server Interaction Flow
Integration Navigation
Step1 Call Create Order and Pay
Use the Create Order and Pay interface to directly initiate WeChat Pay
Step2 Handle Payment Response
Handle returned payment parameters according to different payment scenarios:
Key Parameter Description:
device.orderTerminal
- 02-PC browser(pc)
- 04-SDK(ios)
- 05-SDK(Android)
shopperIP
- User's public IP address, required by WeChat Pay, otherwise will cause error
- Please obtain the real consumer IP address, cannot use localhost, 127.0.0.1 or other loopback addresses
PC Payment
device.orderTerminal = 02
Create order and pay interface return parameters:
qrCode: WeChat'sqrCode, merchant needs to handle QR code displaypaymentRedirectUrl: PingPongCheckout wrapped QR code page, just redirect to this page
Mobile Browser Payment
device.orderTerminal = 04 or 05
Create order and pay interface return parameters:
paymentRedirectUrl: Corresponds to WeChat'smwebUrlparameter
Webview Payment
device.orderTerminal = 04 or 05
Create order and pay interface return parameters:
paymentRedirectUrl: Corresponds to WeChat'smwebUrlparameter
Solution 1: Webview Directly Launch WeChat Pay
Request create order and pay interface, get
paymentRedirectUrl.Set Referer
Android: Add Referer when loadUrl
val headers = mutableMapOf<String, String>() headers["Referer"] = "https://your-domain.com" // Must be consistent with authorized domain webView.loadUrl(mwebUrl, headers)iOS: Set Referer in request header (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)Launch WeChat and pay
Solution 2: Launch WeChat Pay Through Intermediate Page
Request create order and pay interface, get
paymentRedirectUrl.Create pay-proxy intermediate page
<!-- https://intermediate-page-domain/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://intermediate-page-domain/back?orderId=${getQuery('orderId')}` ); location.replace(`${mweb_url}&redirect_url=${redirect}`); })(); </script>Create back callback page
<!-- https://intermediate-page-domain/back --> <script> location.replace( `yourapp://payResult?orderId=${getQuery('orderId')}&result=${getQuery('result')}` ); </script>App WebView loads intermediate page
webView.loadUrl("https://intermediate-page-domain/pay-proxy?orderId=123")Intercept and launch WeChat
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 }Receive callback and refresh order
Parse parameters inhandlePayResult(url), close WebView, query backend order status.
