最近实现了APP端微信支付的功能(下单、支付、查询订单、退款、退款查询),记录一下遇到的问题。
一、微信支付接口地址:
app微信支付: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3
二、签名的坑:
注意:1. 后台请求微信的参数都是用 “_” 分割的:
比如:统一下单请求是后台发起的, 这个参数名在签名的时候,参数名都是 用 “_” 分割形式的。
2. APP端请求参数的参数名是不含有 “_” 的,并且全部小写。
比如: 调起支付的请求是在APP端向微信发起请求的,但是签名是后台根据统一下单的返回结果,在后台完成的。
这个时候参数名称,也要全部小写,并且不带 “_”
三、 关于支付接口回调、 退款接口的回调:
可以暴露两个服务的接口来接收回调的数据,
支付结果通知 : 用于验证支付是否成功
退款结果通知: 用于验证退款是否成功
四、 关于申请退款:
这个接口是需要证书的。事先在卖家商户平台下载好微信支付的证书。
private static WXPayRequest getWXPayRequestInstance() throws Exception {
return new WXPayRequest(new WXPayConfig() {
public String getAppID() {
return WxCommonConstant.APP_ID;
}
public String getMchID() {
return WxCommonConstant.MCH_ID;
}
public String getKey() {
return WxCommonConstant.KEY;
}
public InputStream getCertStream() throws FileNotFoundException {
File file = new File(WxCommonConstant.APICLIENT_CERT_PATH);
return new FileInputStream(file);
}
public IWXPayDomain getWXPayDomain() {
return new IWXPayDomain() {
public void report(String domain, long elapsedTimeMillis, Exception ex) {
System.out.println("==================== report begin ===================");
System.out.println(domain);
System.out.println(elapsedTimeMillis);
System.out.println(ex);
System.out.println("==================== report end ===================");
}
public DomainInfo getDomain(WXPayConfig config) {
return new DomainInfo(WXPayConstants.DOMAIN_API, true);
}
};
}
});
}
在微信配置对象中, 通过返还一个包含证书的输入流,设置进去的。