一、使用场景
扫码付,指的是支付平台,给每个用户的具体订单生成一个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页面。