一、使用场景
扫码付,指的是支付平台,给每个用户的具体订单生成一个QR二维码,用户本人或者他人扫码付款。
付款用户可以直接识别二维码,或者下载到本地,通过微信或支付宝扫一扫识别,第二步将跳转至对应的支付页面H5–第三方支付提供。
二维码其实就是一个h5地址,既要支持微信扫,又要支持支付宝扫。
简单的流程如下:
从上述要求寻找浦发银行的支付方式,交易类型tranType,选择“OK-聚合动态码支付”。
下面将具体介绍浦发银行的扫码付。
二、扫码付接口
和jsapi支付是同一个接口,交易类型不同,且不必要openId。
- 接口名称:对公收款支付
- 接口URI:/api/corporateAccounts/payments/orders
- 请求方式:POST
请求报文
- terminalNo:终端号,在申请商户的时候,由浦发银行分配给我们
- cmdtyDsc:商品描述
- tranAmt:交易金额,单位是元
- iPAdress:这个最容易踩坑,地址的英文明明是address,它偏偏要少写一个d;其次该字段在Lombok自动生成getter/setter的时候,会变成“IPAdress”。
- mrchlInfmAdr:支付回调的异步通知地址
- tranType:选择“OK”
- mrchId:商户号,在联调接口前,先在浦发后台申请好商户(注意:不是浦发开放平台,这也是我想不明白的地方:既然有开放平台,怎么不把商户后台相关功能一并开放给商户呢?这一点还是微信商户后台做得好,真的是让银行望尘莫及了)
- mrchOrdrNo:平台支付流水号,这个字段命名也是醉了(好端端的订单编号OrderNo,被他给取成了OrdrNo,每次都生怕写错了)
响应报文
- tranOrdrNo:浦发银行支付流水号,需要保存至支付订单
- trandDate:交易日期,本来没什么用,查询支付结果接口中需要用到它,且必传参数。
- qRCdLind:二维码链接,这就是我们本文的主要成果,目标就是为了得到它。
示例报文
- 请求报文
{
"terminalNo": "98A00162",
"mrchOrdrNo": "052B40408140404004512",
"cmdtyDsc": "商品描述",
"tranType": "OK",
"mrchId": "310319982990001",
"IPAdress": "127.0.0.1",
"mrchTm": "20240408140404",
"mrchlInfmAdr": "http://122.xx.xx.xx:6008/pay/api/v1/xxx/xxx",
"tranAmt": "0.01"
}
- 响应报文
{
"statusCode": "0000",
"transNo": "04972404086861405202210686",
"isSbscrbFlg": "",
"isFlag": "",
"pyBnkInfo": "",
"totalAmt": "",
"clueDtl": "",
"byrOfAlipayAcctNO": "",
"actRcvAmt": "",
"byrPayAmt": "",
"usPntsPayAmt": "",
"toUsEstbInvAmt": "",
"inrChlCnlNo": "",
"aLPAYCdBal": "",
"mrchStrNm": "xxx公司",
"userId": "",
"addItInNal": "",
"fldData": "",
"clrgDate": "",
# 支付中状态
"ordrSt": "09",
"tranType": "OK",
"tranAmt": "0.01",
"thdPtySeq": "",
"tranOrdrNo": "1901040814042900150041165352",
"tranDate": "20240408",
"qRCdLink": "https://etest2.spdb.com.cn/msemk-cli-h5app/#/H5CompanyPay?H5Channel=400&qrCode=https%3A%2F%2Fqr.95516.com%2F03100001%2Fccas%2F129%2FOK%2F5CD652D479B73FE9BCF0BAD1241A4F65AE3E1B9E2F9E1F3CB3DADB91D27CBF52",
"praPayCmmFlg": "",
"mrchId": "310319982990001",
"mrchTm": "20240408140429",
"signature": "",
"sgnData": "",
"aLTrnCrc": "",
"pymtMd": "",
"busInfo": "",
"dscntAmnt": "",
"mdsctAmnt": "",
"byUserType": "",
"apndPyMd": "",
"pblcAcctId": "",
"trdMerMechNo": "",
"weChatSubMechNo": "",
"bussRetInfo": "",
"errCode": "",
"errInfo": "",
"trdChnl": "",
"bnkngbsnssSeqNo": "",
"rsrvFld1": "",
"rsrvFld2": "",
"rsrvFld3": "",
"rsrvFld4": "",
"rsrvFld5": "",
"rsrvFld6": "",
"remark": ""
}
得到了返回字段qRCdLink,在通过下文的在线生成qr二维码,即可测试支付。
三、在线生成二维码
这里介绍一款在线生成二维码的工具:qr-code-generator
扫描后,跳转到https://etest2.spdb.com.cn/msemk-cli-h5app
交易单号,即浦发银行支付流水号,它是以1901开头的一串数字。
四、遇到的问题
1、下单账号与支付账号不一致,请核实后再支付
解决办法:上文讲到了,扫码付虽然不要求openId,但是浦发银行的测试环境要求我们必须把微信用户openId加到白名单。
也就说,我们必须先找到微信公众号appId及其下的openId。
2、“errCode”:“CBAS004”,“errInfo”:“缺少必要字段spbill_create_ip(UP0802100)”
从这个报错信息,根本就无法直观地看出是缺少了哪个必要字段。这是因为下单支付接口请求和响应,找遍了也找不到字段spbill_create_ip。
其实就是请求入参缺少了字段iPAdress。想不明白,为什么接口的字段命名得如此随意。
3、当前页面的URL未注册
这个错误很常见,解决途径就是在微信商户后台,【产品中心】–》【开发配置】–》【支付授权目录设置】,添加浦发银行的h5页面。