需求:
增加支付多样性,项目接入ICBC聚合支付。
问题:
在实现二维码被扫支付过程中,当qr_code(被扫二维码)传入后,返回结果是支付中,且查询支付状态一直是支付中。
解决:微信风控原因,微信付款码界面退出后,或通过一维码数字信息支付时,必须输入密码才能完成支付。
扫码机器直接扫出二维码信息,或者在微信付款码界面手动输入付款数字,后输入密码支付。
由于我之前一直用的postman调用接口,qr_code(被扫付款码)一直是通过草料二维码官网把二维码信息解码出来,再去调用接口,导致微信必须退出付款码界面,一直未弹出输入密码界面。困扰许久。如果用扫码机器直接扫描付款码,调用接口。则不需要输入密码。
被扫支付对接代码:
import cn.hutool.core.lang.UUID;
import com.icbc.api.DefaultIcbcClient;
import com.icbc.api.IcbcApiException;
import com.icbc.api.IcbcConstants;
import com.icbc.api.request.QrcodePayRequestV2;
import com.icbc.api.response.QrcodePayResponseV2;
public class QrcodePayTest {
//1、网关公钥
protected static final String APIGW_PUBLIC_KEY = "";
//2、appid
protected static final String APP_ID = "";
//3、密钥对认证方式,公钥在API平台登记,此处为私钥
protected static final String MY_PRIVATE_KEY = "";
public static void main(String[] args) throws Exception {
//签名类型为RSA2时,需传入appid,私钥和网关公钥,签名类型使用定值IcbcConstants.SIGN_TYPE_RSA2,其他参数使用缺省值
DefaultIcbcClient client = new DefaultIcbcClient(APP_ID, IcbcConstants.SIGN_TYPE_RSA2, MY_PRIVATE_KEY, APIGW_PUBLIC_KEY);
QrcodePayRequestV2 request = new QrcodePayRequestV2();
//4、根据测试环境和生产环境替换相应ip和端口
request.setServiceUrl("https://gw.open.icbc.com.cn/api/mybank/pay/qrcode/scanned/pay/V5");
//5、请对照接口文档用bizContent.setxxx()方法对业务上送数据进行赋值
QrcodePayRequestV2.QrcodePayRequestV2Biz bizContent = new QrcodePayRequestV2.QrcodePayRequestV2Biz();
//被扫付款码
bizContent.setQrCode("");
//商户编号
bizContent.setMerId("");
//订单号
bizContent.setOutTradeNo(UUID.fastUUID().toString().substring(0,35));
//订单金额
bizContent.setOrderAmt("1");
bizContent.setTradeDate("20230515");
bizContent.setTradeTime("091001");
request.setBizContent(bizContent);
QrcodePayResponseV2 response;
try {
response = client.execute(request, UUID.fastUUID().toString());//msgId消息通讯唯一编号,要求每次调用独立生成,APP级唯一
if (response.isSuccess()) {
//6、业务成功处理,请根据接口文档用response.getxxx()获取同步返回的业务数据
System.out.println("ReturnCode:"+response.getReturnCode());
System.out.println("response:" + response);
} else {
//失败
System.out.println("ReturnCode:"+response.getReturnCode());
System.out.println("ReturnMsg:"+response.getReturnMsg());
}
} catch (IcbcApiException e) {
e.printStackTrace();
}
}
}