支付宝,微信,银联支付

https://open.unionpay.com/tjweb/index 银联支付
统一支付接口
接口描述
用于线下刷卡交易、生物特征识别(例如人脸)、被扫支付等后台交易。 对于被扫支付,收银员使用扫码设备读取用户微信、支付宝、云闪付等APP付款码以后,二维码或条码信息传送至商户收银台,由商户收银台或者商户后台调用该接口发起支付对用户进行收款。 对于线下刷卡交易,上送卡支付信息域;刷脸和二维码被扫交易上送授权码域。 +三家授权码的规则 关于调用支付接口后相关情况的处理方案:当调用扣款接口返回支付中或未知状态,需要调用查询接口查询订单实际支付状态。当遇到用户超过日限额需要输入密码返回“支付中”的状态,建议 5 秒调一次查询,调用 6 次后还未成功作支付超时处理。 调用订单查询接口建议:查询6次每隔2的N次方秒查询一次(具体的查询次数和时间也可自定义,建议查询时间不低于30秒)6次查询完成,接口仍未返回成功标识,则调用冲正接口;

请求方式
POST

生产地址
https://gateway.95516.com/api/trans.do

测试地址
https://gateway.test.95516.com/api/trans.do

公共请求参数
中文名称 英文名称 域类型 默认值 请求要求 备注
版本号 version String(5) 6.0.0 M-必填
固定填写6.0.0

编码方式 encoding String(1,20) UTF-8 M-必填
填写报文使用的字符编码 UTF-8,默认取值:UTF-8

交易发送时间 txnTime String(14) M-必填
商户发送交易时间,格式: yyyyMMDDHHmmss

签名 signature String(1,1024) M-必填
填写对报文摘要的签名

签名方法 signMethod String(1,32) M-必填
RSA-SHA256:表示采用RSA签名,摘要算法用SHA256

商户代码 merId String(15) M-必填
已被批准加入银联互联网系统的商户代码

固定15位长,仅支持数字和字母

商户订单号 orderId String(8,40) M-必填
商户订单号,不能含“-”或“_”

仅支持数字和字母

商户证书序列号 merCertId String(1,128) M-必填
填写商户签名私钥证书的Serial Number(十进制),该值可通过银联提供的SDK获取

仅支持数字。

随机字符串 nonceStr String(1,32) M-必填
业务接口 bizMethod String(1,128) M-必填
acp.trade.pay

参数集合 bizContent String(1,10240) C-按条件必填
详见请求参数

请求参数
中文名称 英文名称 域类型 默认值 请求要求 备注
交易币种 currencyCode String(3) 156(表示人民币) M-必填
币种格式必须为3位代码,默认取值:156(人民币)

交易金额 txnAmt String(1,12) M-必填
仅支持数字。 单位为【分】,参数值不能带小数

仅支持数字

渠道类型 channelType String(2) M-必填
03:线下POS

11:移动POS

支付场景 scene String(2) M-必填
01:线下刷卡支付

02:条码被扫支付

03:人脸后台支付

终端号 termId String(8) M-必填
授权码 authCode String(1,128) C-按条件必填
支付场景为条码被扫支付或者人脸后台支付时必送

用于被扫场景下的二维码支付时,

授权码的默认有效时间为3分钟

扫码支付授权码,设备读取用户云闪付、微信或者支付宝中的条码或者二维码信息;

用于人脸标记时,仅支持15到19位长度。

刷卡支付信息域 cardInfo CardInfo C-按条件必填 查看详情
A条码被扫支付个性化请求域 aliExtendPayReq AliExtendPayReq O-选填 查看详情
T条码被扫支付个性化请求域 wxExtendPayReq WxExtendPayReq O-选填 查看详情
U个性化请求域 upExtendReq UpExtendReq O-选填 查看详情
操作员 operId String(1,28) O-选填
商户操作员编号

门店编号 opShopId String(1,32) O-选填
请求方自定义域 reqReserved String(1,1024) O-选填
商户自定义保留域,交易应答时会原样返回

终端信息 termInfo TermInfo O-选填 查看详情
公共应答参数
中文名称 英文名称 域类型 默认值 请求要求 备注
交易状态码 resultCode String(1,10) M-必填
SUCCESS:成功

FAILURE:失败

UNKNOWN:未知

PROCESSING:处理中

签名 signature String(1,1024) M-必填
填写对报文摘要的签名

银联证书序列号 cupCertId String(1,128) M-必填
填写银联签名私钥证书的Serial Number(十进制),该值可通过银联提供的SDK获取。

仅支持数字。

参数集合 bizContent String(1,10240) C-按条件必填
具体见应答参数

交易应答码 respCode String(1,128) C-按条件必填
返回信息为具体原因,如:

成功:SUCCESS

系统异常:SYSTEM_ERROR

验签失败:SIGNATURE_VERIFY_FAIL

无此交易权限:NOT_AUTH

余额不足:NOT_ENOUGH_MONEY

银行系统异常:BANK_ERROR

交易密码错:PIN_ERROR

……

交易应答信息 respMsg String(1,256) C-按条件必填
返回交易应答信息的详细描述

交易发送时间 txnTime String(14) R-需要返回
商户发送交易时间,格式: yyyyMMDDHHmmss

商户代码 merId String(15) R-需要返回
已被批准加入银联互联网系统的商户代码

固定15位长,仅支持数字和字母

商户订单号 orderId String(8,40) R-需要返回
商户订单号,不能含“-”或“_”

仅支持数字和字母

随机字符串 nonceStr String(1,32) R-需要返回
应答参数
中文名称 英文名称 域类型 默认值 请求要求 备注
银联受理订单号 tn String(21) C-按条件必填
由银联返回,用于在后续类交易中唯一标识一笔交易

21位定长,仅支持数字

交易币种 currencyCode String(3) 156(表示人民币) R-需要返回
币种格式必须为3位代码,默认取值:156(人民币)

交易金额 txnAmt String(1,12) R-需要返回
仅支持数字。 单位为【分】,参数值不能带小数

仅支持数字

请求方自定义域 reqReserved String(1,1024) R-需要返回
商户自定义保留域,交易应答时会原样返回

A条码被扫支付个性化应答域 aliExtendPayResp AliExtendPayResp O-选填 查看详情
T条码被扫支付个性化应答域 wxExtendPayResp WxExtendPayResp O-选填 查看详情
U个性化应答域 upExtendResp UpExtendResp O-选填 查看详情
HTTP请求源码:
version=6.0.0&encoding=UTF-8&merCertId=123456&signMethod=RSA-SHA256&bizMethod=acp.unified.pay&merId=123456789&nonceStr=asdfasdf&signature=ft1242Q6Hrrsx2hmyIEGvSfA5777wXUXvZtQVqsrdy7TAxzgro=
&orderId=12345678&bizContent={
"scene": "01",
"authCode": "625899998745556",
"txnAmt": 1000,
"currencyCode": "156",
"backUrl": "http://merchantsvc.do",
"needReceipt": "Y",
"termId": "12345678",
"termInfo": {
"mchCreateIP": "",
"longitude": "",
"latitude": "",
"networkLicense": "",
"termDeviceType": "04",
"serialNum": "",
"encryptRandNum": "",
"secretText": "",
"appVersion": "",
"mCountryCode": ""
},
"WxExtendPayReq": {
"appid": "wx8888888888888888",
"deviceInfo": "13467007045764",
"body": "形象店-深圳腾大- QQ公仔",
"detail": {
"costPrice": 608800,
"receiptId": "wx123",
"goodsDetail": [{
"goodsId": "商品编码",
"wxpayGoodsid": "1001",
"goodsName": "",
"quantity": 1,
"price": 528800
},
{
"goodsId": "商品编码",
"wxpayGoodsId": "1002",
"goodsName": "iPhone6s 32G",
"quantity": 1,
"price": 608800
}
]
},
"goodsTag": "1234",
"receipt": "Y",
"sceneInfo": {
"storeInfo": {
"id": "SZTX001",
"name": "餐厅",
"areaCode": "440305",
"address": "大厦"
}
}
}
}}//为确保安全通信,需自行验证响应示例中的signature值是否为银联所提供。

https://open.alipay.com/platform/home.htm https://opendocs.alipay.com/open/270/105898支付宝支付
开放能力 > 支付能力 > 电脑网站支付 > 快速接入
快速接入
更新时间:2020-08-24 18:28:40
本文展示了如何从零开始,使用支付宝开放平台服务端 SDK 快速接入电脑网站支付产品,完成与支付宝对接的部分。 由于支付产品全面升级,若您使用的是旧版本接口,请移步即时到账文档。若您希望从即时到账(使用旧版本接口)升级为电脑网站支付(使用新版本接口),请参考以下步骤完成即时到账新版本(即电脑网站支付)的接入工作。

注意: 文档中的代码示例和 Demo 是用来阐述 API 基本使用方法的,仅针对大众场景,供 ISV 参考。特殊情况还请 ISV 自行扩展,确保符合自身业务需求。

第一步:创建应用
要在您的应用中接入电脑网站支付能力,您需要登录支付宝开放平台(open.alipay.com),在开发者中心中创建您的应用,应用审核通过后会生成应用唯一标识(APPID),并且可以申请开通开放产品使用权限。通过 APPID 您的应用才能调用开放产品的接口能力。需要详细了解开放平台创建应用步骤请参考《开放平台应用创建指南》。

第二步:配置应用

添加功能并签约
应用创建完成后,系统会自动跳转到应用详情页面。开发者可以在 功能列表 中点击 添加功能 来添加电脑网站支付功能。待应用上线后,您可以给添加的功能进行签约。电脑网站支付功能支持两种签约方式:商家中心签约和应用详情的功能列表处签约(如下图所示)。 详细步骤步骤可以参考添加应用功能,第三方应用可以代替商户签约。

配置密钥
为了保证交易双方(商户和支付宝)的身份和数据安全,开发者在调用接口前,需要配置双方密钥,对交易数据进行双方校验。密钥包含应用私钥(APP_PRIVATE_KEY)和应用公钥(APP_PUBLIC_KEY)。生成密钥后,开发者需要在开放平台开发者中心进行密钥配置,配置完成后可以获取支付宝公钥(ALIPAY_PUBLIC_KEY),配置的详细步骤请参考《配置应用环境》。您还可以通过观看快速签名教程学习密钥的配置。

说明: 支付宝开放平台 SDK 封装了签名和验签过程,只需配置账号及密钥参数,建议开发者使用。开发者还可以通过自助排查流程和验签教程自助排查配置应用过程中遇到的问题。

第三步:集成并配置 SDK
要接入电脑网站支付,开发者需要集成服务端 SDK。服务端 SDK 需要商户集成在自己的服务端系统中,用于后续的服务端接口调用。

下载服务端 SDK
** 为了帮助开发者调用开放接口,我们提供了开放平台服务端 SDK,包含 JAVA、PHP、NodeJS、Python 和 .NET 五种,封装了签名&验签、HTTP 接口请求等基础功能。请先下载对应语言版本的 SDK 并引入您的开发工程。

接口调用配置
在 SDK 调用前需要进行初始化,以 JAVA 代码为例:

AlipayClient alipayClient = new DefaultAlipayClient(URL,APP_ID,APP_PRIVATE_KEY,FORMAT,CHARSET,ALIPAY_PUBLIC_KEY,SIGN_TYPE);
关键参数说明:

配置参数 示例值解释 获取方式/示例值
URL 支付宝网关(固定) https://openapi.alipay.com/gateway.do
APPID APPID 即创建应用后生成 获取见上方创建应用
APP_PRIVATE_KEY 开发者私钥,由开发者自己生成 获取见配置密钥
FORMAT 参数返回格式,只支持 json json(固定)
CHARSET 编码集,支持 GBK/UTF-8 开发者根据实际工程编码配置
ALIPAY_PUBLIC_KEY 支付宝公钥,由支付宝生成 获取详见配置密钥
SIGN_TYPE 商户生成签名字符串所使用的签名算法类型,目前支持 RSA2 和 RSA,推荐使用 RSA2 RSA2
接下来,就可以用 alipayClient 来调用具体的 API 了。alipayClient 只需要初始化一次,后续调用不同的 API 都可以使用同一个 alipayClient 对象。

注意: ISV /开发者可以通过第三方应用授权得到商户授权令牌(app_auth_token)作为请求参数传入,实现代商户发起请求的能力。

第四步:接口调用

支付
电脑网站支付的支付接口 alipay.trade.page.pay 调用时序图如下: 电脑网站支付.png

调用顺序如下:

商户系统请求支付宝接口 alipay.trade.page.pay,支付宝对商户请求参数进行校验,而后重新定向至用户登录页面。

用户确认支付后,支付宝通过 get 请求 returnUrl(商户入参传入),返回同步返回参数。

交易成功后,支付宝通过 post 请求 notifyUrl(商户入参传入),返回异步通知参数。

若由于网络等问题异步通知没有到达,商户可自行调用交易查询接口 alipay.trade.query 进行查询,根据查询接口获取交易以及支付信息(商户也可以直接调用查询接口,不需要依赖异步通知)。

注意:

由于同步返回的不可靠性,支付结果必须以异步通知或查询接口返回为准,不能依赖同步跳转。

商户系统接收到异步通知以后,必须通过验签(验证通知中的 sign 参数)来确保支付通知是由支付宝发送的。详细验签规则参考异步通知验签。

接收到异步通知并验签通过后,一定要检查通知内容,包括通知中的 app_id、out_trade_no、total_amount 是否与请求中的一致,并根据 trade_status 进行后续业务处理。

在支付宝端,partnerId 与 out_trade_no 唯一对应一笔单据,商户端保证不同次支付 out_trade_no 不可重复;若重复,支付宝会关联到原单据,基本信息一致的情况下会以原单据为准进行支付。

开放平台提供了支持主流开发语言的 SDK 接入的方式。对于页面跳转类 API,SDK 不会也无法像系统调用类 API 一样自动请求支付宝并获得结果,而是在接受 request 请求对象后,为开发者生成前台页面请求需要的完整 form 表单的 html(包含自动提交脚本),商户直接将这个表单的 String 输出到 http response 中即可。

以 JAVA 语言为例,调用统一收单下单并支付页面接口 alipay.trade.page.pay 的代码示例如下:

public void doPost (HttpServletRequest httpRequest,
HttpServletResponse httpResponse) throws ServletException, IOException {
AlipayClient alipayClient = new DefaultAlipayClient( "https://openapi.alipay.com/gateway.do" , APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); //获得初始化的AlipayClient
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); //创建API对应的request
alipayRequest.setReturnUrl( "http://domain.com/CallBack/return_url.jsp" );
alipayRequest.setNotifyUrl( "http://domain.com/CallBack/notify_url.jsp" ); //在公共参数中设置回跳和通知地址
alipayRequest.setBizContent( "{" +
" "out_trade_no":"20150320010101001"," +
" "product_code":"FAST_INSTANT_TRADE_PAY"," +
" "total_amount":88.88," +
" "subject":"Iphone6 16G"," +
" "body":"Iphone6 16G"," +
" "passback_params":"merchantBizType%3d3C%26merchantBizNo%3d2016010101111"," +
" "extend_params":{" +
" "sys_service_provider_id":"2088511833207846"" +
" }" +
" }" ); //填充业务参数
String form= "" ;
try {
form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
} catch (AlipayApiException e) {
e.printStackTrace();
}
httpResponse.setContentType( "text/html;charset=" + CHARSET);
httpResponse.getWriter().write(form); //直接将完整的表单html输出到页面
httpResponse.getWriter().flush();
httpResponse.getWriter().close();
}
对异步返回结果进行验签的 JAVA 示例代码如下:

Map<String, String> paramsMap = ... //将异步通知中收到的所有参数都存放到 map 中
boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, ALIPAY_PUBLIC_KEY, CHARSET, SIGN_TYPE) //调用SDK验证签名
if (signVerfied){
// TODO 验签成功后,按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验,校验成功后在response中返回success并继续商户自身业务处理,校验失败返回failure
} else {
// TODO 验签失败则记录异常日志,并在response中返回failure.
}
以 JAVA 语言为例,调用统一收单线下交易查询接口 alipay.trade.query 的示例代码如下:

AlipayClient alipayClient = new DefaultAlipayClient( "https://openapi.alipay.com/gateway.do" , "app_id" , "your private_key" , "json" , "GBK" , "alipay_public_key" , "RSA2" );
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
request.setBizContent( "{" +
" "out_trade_no":"20150320010101001"," +
" "trade_no":"2014112611001004680 073956707"" +
" }" );
AlipayTradeQueryResponse response = alipayClient.execute(request);
if (response.isSuccess()){
System.out.println( "调用成功" );
} else {
System.out.println( "调用失败" );
}

退款
若用户或商户需要退款,商户可调用 alipay.trade.refund 接口进行退款,支付宝同步返回退款参数。电脑网站支付的退款接口 alipay.trade.refund 调用时序图如下: image.png

若退款接口由于网络等原因返回异常,商户可调用退款查询接口 alipay.trade.fastpay.refund.query 查询指定交易的退款信息。

注意:

当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,支付宝将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退回到买家账号上。

交易超过约定时间(签约时设置的可退款时间)的订单无法进行退款。

支付宝退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。

一笔退款失败后重新提交,要采用原来的退款单号。

总退款金额不能超过用户实际支付金额。

退款信息以退款接口同步返回或者退款查询接口 alipay.trade.fastpay.refund.query 为准。

开放平台提供了支持主流开发语言的 SDK 接入的方式,以 JAVA 语言为例,调用统一收单交易退款接口 alipay.trade.refund 的代码示例如下:

AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key");
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
request.setBizContent("{" +
" "out_trade_no":"20150320010101001"," +
" "trade_no":"2014112611001004680073956707"," +
" "refund_amount":200.12," +
" "refund_reason":"正常退款"," +
" "out_request_no":"HZ01RF001"," +
" "operator_id":"OP001"," +
" "store_id":"NJ_S_001"," +
" "terminal_id":"NJ_T_001"" +
" }");
AlipayTradeRefundResponse response = alipayClient.execute(request);
if(response.isSuccess()){
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}
调用统一收单交易退款查询接口 alipay.trade.fastpay.refund.query 的 JAVA 示例代码如下:

AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key");
AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();
request.setBizContent("{" +
" "trade_no":"20150320010101001"," +
" "out_trade_no":"2014112611001004680073956707"," +
" "out_request_no":"2014112611001004680073956707"" +
" }");
AlipayTradeFastpayRefundQueryResponse response = alipayClient.execute(request);
if(response.isSuccess()){
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}

关闭交易
通常交易关闭是通过 alipay.trade.page.pay 中的超时时间来控制,支付宝也提供给商户一个手动关闭交易的接口alipay.trade.close。若用户一直未支付,商户可以调用该接口关闭指定交易;成功关闭交易后该交易不可支付。交易关闭接口的调用时序图 alipay.trade.close 如下图所示:

开放平台提供了支持主流开发语言的 SDK 接入的方式,以 JAVA 语言为例,调用统一收单交易关闭接口 alipay.trade.close 的代码示例如下:

AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key","RSA2");
AlipayTradeCloseRequest request = new AlipayTradeCloseRequest();
request.setBizContent("{" +
" "trade_no":"2013112611001004680073956707"," +
" "out_trade_no":"HZ0120131127001"," +
" "operator_id":"YX01"" +
" }");
AlipayTradeCloseResponse response = alipayClient.execute(request);
if(response.isSuccess()){
System.out.println("调用成功");
} else {
System.out.println("调用失败");
}

下载账单
为方便商户快速查账,开放平台支持商户通过查询对账单下载地址接口 alipay.data.dataservice.bill.downloadurl.query 获取商户离线账单下载地址。调用该接口的时序图如下:

开放平台提供了支持主流开发语言的 SDK 接入的方式,以 JAVA 语言为例,调用查询对账单下载地址接口 alipay.data.dataservice.bill.downloadurl.query 的代码示例如下:

AlipayClient alipayClient = new DefaultAlipayClient( "https://openapi.alipay.com/gateway.do" , APP_ID, APP_PRIVATE_KEY, "json" , CHARSET, ALIPAY_PUBLIC_KEY, "RSA2" ); //获得初始化的AlipayClient
AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest(); //创建API对应的request类
request.setBizContent( "{" +
" "bill_type":"trade"," +
" "bill_date":"2016-04-05""
" }" ); //设置业务参数
AlipayDataDataserviceBillDownloadurlQueryResponse response = alipayClient.execute(request);
System.out.print(response.getBody());
//根据response中的结果继续业务逻辑处理
开发者在得到接口返回的账单下载地址(bill_download_url)后还可以下载账单文件,JAVA 示例代码如下:

//将接口返回的对账单下载地址传入urlStr
String urlStr = "http://dwbillcenter.alipay.com/downloadBillFile.resource?bizType=X&userId=X&fileType=X&bizDates=X&downloadFileName=X&fileId=X" ;
//指定希望保存的文件路径
String filePath = "/Users/fund_bill_20160405.csv" ;
URL url = null ;
HttpURLConnection httpUrlConnection = null ;
InputStream fis = null ;
FileOutputStream fos = null ;
try {
url = new URL(urlStr);
httpUrlConnection = (HttpURLConnection) url.openConnection();
httpUrlConnection.setConnectTimeout( 5 * 1000 );
httpUrlConnection.setDoInput( true );
httpUrlConnection.setDoOutput( true );
httpUrlConnection.setUseCaches( false );
httpUrlConnection.setRequestMethod( "GET" );
httpUrlConnection.setRequestProperty( "Charsert" , "UTF-8" );
httpUrlConnection.connect();
fis = httpUrlConnection.getInputStream();
byte [] temp = new byte [ 1024 ];
int b;
fos = new FileOutputStream( new File(filePath));
while ((b = fis.read(temp)) != - 1 ) {
fos.write(temp, 0 , b);
fos.flush();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fis!= null ) fis.close();
if (fos!= null ) fos.close();
if (httpUrlConnection!= null ) httpUrlConnection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}

关于沙箱
沙箱环境是开放平台提供给开发者调试接口的环境,具体操作步骤见沙箱接入指南。 沙箱接入注意事项:

电脑网站支付支持沙箱接入;在沙箱调通接口后,必须在线上进行测试与验收,所有返回码及业务逻辑以线上为准;

电脑网站支付只支持余额支付,不支持银行卡、余额宝等其他支付方式;

支付时,请使用沙箱买家账号支付;

如果扫二维码付款时,请使用沙箱支付宝客户端扫码付款。
https://pay.weixin.qq.com/wiki/doc/api/index.html 微信支付
开发步骤
接口流程图

1、用户在商户侧完成下单,使用微信支付进行支付

2、由商户后台向微信支付发起下单请求(调用统一下单接口)注:交易类型trade_type=MWEB

3、统一下单接口返回支付相关参数给商户后台,如支付跳转url(参数名“mweb_url”),商户通过mweb_url调起微信支付中间页

4、中间页进行H5权限的校验,安全性检查(此处常见错误请见下文)

5、如支付成功,商户后台会接收到微信侧的异步通知

6、用户在微信支付收银台完成支付或取消支付,返回商户页面(默认为返回支付发起页面)

7、商户在展示页面,引导用户主动发起支付结果的查询

8,9、商户后台判断是否接到收微信侧的支付结果通知,如没有,后台调用我们的订单查询接口确认订单状态

10、展示最终的订单支付结果给用户

常见问题
一、回调页面

正常流程用户支付完成后会返回至发起支付的页面,如需返回至指定页面,则可以在MWEB_URL后拼接上redirect_url参数,来指定回调页面。

如,您希望用户支付完成后跳转至https://www.wechatpay.com.cn,则可以做如下处理:

假设您通过统一下单接口获到的MWEB_URL= https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20161110163838f231619da20804912345&package=1037687096

则拼接后的地址为MWEB_URL= https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20161110163838f231619da20804912345&package=1037687096&redirect_url=https%3A%2F%2Fwww.wechatpay.com.cn

注意:
1.需对redirect_url进行urlencode处理

2.由于设置redirect_url后,回跳指定页面的操作可能发生在:1,微信支付中间页调起微信收银台后超过5秒 2,用户点击“取消支付“或支付完成后点“完成”按钮。因此无法保证页面回跳时,支付流程已结束,所以商户设置的redirect_url地址不能自动执行查单操作,应让用户去点击按钮触发查单操作。回跳页面展示效果可参考下图

二、其它常见错误

序号 问题 错误描述 解决方法
1 网络环境未能通过安全验证,请稍后再试 1. 商户侧统一下单传的终端IP(spbill_create_ip)与用户实际调起支付时微信侧检测到的终端IP不一致导致的,这个问题一般是商户在统一下单时没有传递正确的终端IP到spbill_create_ip导致,详细可参见客户端ip获取指引

  1. 统一下单与调起支付时的网络有变动,如统一下单时是WIFI网络,下单成功后切换成4G网络再调起支付,这样可能会引发我们的正常拦截,请保持网络环境一致的情况下重新发起支付流程

2 商家参数格式有误,请联系商家解决

  1. 当前调起H5支付的referer为空导致,一般是因为直接访问页面调起H5支付,请按正常流程进行页面跳转后发起支付,或自行抓包确认referer值是否为空

  2. 如果是APP里调起H5支付,需要在webview中手动设置referer,如(
    Map extraHeaders = new HashMap();
    extraHeaders.put("Referer", "商户申请H5时提交的授权域名");//例如 http://www.baidu.com ))

3 商家存在未配置的参数,请联系商家解决 1,当前调起H5支付的域名(微信侧从referer中获取)与申请H5支付时提交的授权域名不一致,如需添加或修改授权域名,请登陆商户号对应的商户平台--"产品中心"--"开发配置"自行配置

2,如果设置了回跳地址redirect_url,请确认设置的回跳地址的域名与申请H5支付时提交的授权域名是否一致
4 支付请求已失效,请重新发起支付 统一下单返回的MWEB_URL生成后,有效期为5分钟,如超时请重新生成MWEB_URL后再发起支付
5 请在微信外打开订单,进行支付 H5支付不能直接在微信客户端内调起,请在外部浏览器调起
6 IOS:签名验证失败
安卓:系统繁忙,请稍后再试 1,请确认同一个MWEB_URL只被一个微信号调起,如果不同微信号调起请重新下单生成新的MWEB_URL

2,如MWEB_URL有添加redirect_url,请确认参数拼接格式是否有误,是否有对redirect_url的值做urlencode,可对比以下例子格式:

https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20161110163838f231619da20804912345&package=1037687096&redirect_url=https%3A%2F%2Fwww.wechatpay.com.cn

三、QA

Q1:
1、传递redirect_url safari浏览器时支付完成后会新开一个页面;
2、还有就是有些ios手机使用其他浏览器支付完成后默认会回到safari浏览器。
这个错误咱们文档这边有说明吗?

A1:
1、目前逻辑就是这样设计的,防止商户无限循环调用微信客户端
2、对的,返回需要浏览器的schame信息,部分浏览器隐藏了这个信息,在无法拿到schame信息的情况下,就会回到safari浏览器

只为更好的服务;服务工作者。
原文地址:https://www.cnblogs.com/pony-mamba/p/13580739.html