大家好,又见面了,我是你们的朋友全栈君。
微信支付-支付结果通知接收
最近在做微信支付功能在微信成功后,微信通过异步方式返回支付结果是遇到了问题:参数接收不到。后来通过查阅资料才将问题解决,现在将解决方法分享一下。
###官方文档解释
如上图所示:通过微信支付时要先在微信支付系统生成预付订单,然后才能在前台发起支付请求。生成预付订单时会向微信支付系统传递一个参数:notify_url。下面是该参数的解释:
微信对这个回调路径没有特殊要求,不需要授权目录下,也不需要在同一个域名下,端口也没要求。
支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。
对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)
注意:微信调用notify_url时不会携带参数,所以说商户后台系统不能直接获得微信返回的支付信息,返回信息是以数据流的方式返回的,必须先将流信息转化成XML形式才能获得支付信息。微信返回的支付信息如下所示:
<xml>
<appid><![CDATA[wx2421b1c4370ec43b]]></appid>
<attach><![CDATA[支付测试]]></attach>
<bank_type><![CDATA[CFT]]></bank_type>
<fee_type><![CDATA[CNY]]></fee_type>
<is_subscribe><![CDATA[Y]]></is_subscribe>
<mch_id><![CDATA[10000100]]></mch_id>
<nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str>
<openid><![CDATA[oUpF8uMEb4qRXf22hE3X68TekukE]]></openid>
<out_trade_no><![CDATA[1409811653]]></out_trade_no>
<result_code><![CDATA[SUCCESS]]></result_code>
<return_code><![CDATA[SUCCESS]]></return_code>
<sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign>
<sub_mch_id><![CDATA[10000100]]></sub_mch_id>
<time_end><![CDATA[20140903131540]]></time_end>
<total_fee>1</total_fee>
<trade_type><![CDATA[JSAPI]]></trade_type>
<transaction_id><![CDATA[1004400740201409030005092168]]></transaction_id>
</xml>
具体含义请参照官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7
###实现方式
public String getWeChatPayReturn(HttpServletRequest request){
try {
InputStream inStream = request.getInputStream();
int _buffer_size = 1024;
if (inStream != null) {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] tempBytes = new byte[_buffer_size];
int count = -1;
while ((count = inStream.read(tempBytes, 0, _buffer_size)) != -1) {
outStream.write(tempBytes, 0, count);
}
tempBytes = null;
outStream.flush();
//将流转换成字符串
String result = new String(outStream.toByteArray(), "UTF-8");
//将字符串解析成XML
Document doc = DocumentHelper.parseText(result);
//将XML格式转化成MAP格式数据
Map<String, Object> resultMap = XmlMapHandle.Dom2Map(doc);
//后续具体自己实现
}
//通知微信支付系统接收到信息
return "<xml><return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>";
} catch (Exception e) {
System.out.println(e.getMessage());
}
//如果失败返回错误,微信会再次发送支付信息
return "fail";
}
通过上面的操作,应该不会有太大的问题了。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/139773.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...