一、问题描述
最近在开发支付宝扫码支付,也就是当面付,代码写完之后,请求支付宝接口,一直返回错误信息:
{"msg":"Insufficient Conditions","code":"40003","sub_msg":"验签出错, 未配置对应签名算法的公钥或者证书","sub_code":"isv.missing-signature-config"}}
二、解决方法
在网上找了一番,基本上都是说: https://docs.open.alipay.com/200/106122
开放平台未配置商户公钥导致。请登录开放平台,上传公钥。可问题是公钥私钥都没错,APP支付都能用,为什么这里不能用。。。困惑。。使用的是官方的DEMO进行测试,也不行,最后在官方的教程中,搞定了:https://docs.open.alipay.com/194/105170/
AlipayClient alipayClient = new DefaultAlipayClient(gateway,app_id,private_key(开发者私钥),"json","utf-8",alipay_public_key(支付宝公钥),sign_type(签名方式));
String subject = "fendo 支付宝扫码支付测试";
String totalAmount = "0.01";
String storeId = "123";
AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
model.setSubject(subject);
model.setTotalAmount(totalAmount);
model.setStoreId(storeId);
model.setTimeoutExpress("5m");
model.setOutTradeNo(WeixinPayUtil.getRandomString(12));
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
request.setBizModel(model);
request.setNotifyUrl("https://xxxx/pay/alipay/notify_url");
log.info(" 扫描请求参数: " + JSON.toJSONString(request));
AlipayTradePrecreateResponse responses = alipayClient.execute(request);
ServletOutputStream servletOutputStream = null;
servletOutputStream = response.getOutputStream();
JSONObject jsonObject = JSONObject.parseObject(responses.getBody());
log.info(" 扫描响应参数: " + jsonObject);
String qr_code = jsonObject.getJSONObject("alipay_trade_precreate_response").getString("qr_code");
//调用生成二维码的方法
QRCodeUtil.encode(qr_code, servletOutputStream);
注意:
1.要使用当面付需要申请签约,然后才能使用。
2.当面付使用的秘钥是你创建的应用里的秘钥,而并不是mapi/wap网关的秘钥。
3.千万不要把其中的秘钥搞错了,有几个秘钥,一个是商户私钥公钥,也就是自己生成的秘钥,然后把秘钥上传到支付会得到一个支付宝公钥。
4.有时候报签名这类错误,如果原来能用,用在别的功能上就不能用了,比如说APP支付能用,用在扫码支付上却报错,基本上可以确定是代码的原因,上面的错误就是代码的原因。。
5.当面付中的auth_code是,打开支付宝付钱,条形码下会对应有一串数字,注意这传数字,不要轻易泄露出去,不然,别人可以通过条形码支付的方法,把你的钱转走。
参考:
https://openclub.alipay.com/read.php?tid=1568&fid=46