您的位置:首页 > 移动开发 > 微信开发

微信支付开发-从零开始-Part4

2016-05-11 10:56 239 查看
上一篇已经可以在微信浏览器内调出微信付款密码输入界面了,对应的JS端有个回调函数,返回说明如下:



function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ) {} // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。<span style="font-family: Arial, Helvetica, sans-serif;">}</span>


可以看出即使返回OK也不保证支付成功,当用户点击密码输入框左上角x关闭时会触发cancel以及fail【不必细化区分】,可在此处做支付失败的提示以及对应操作。







支付成功后微信会向下单时你提交的notify_url发送共八次的请求,该请求会返回如下信息:

<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>
JAVA可用如下的工具方法解析微信通知信息转为map以便于后续业务操作:

/**
* 解析微信支付成功通知信息
* @param request
* @return
* @throws Exception
*/
public static Map<String, String> parseRequestXml2Map(HttpServletRequest request){
// 解析结果存储在HashMap
Map<String, String> map = new HashMap<String, String>();
InputStream inputStream = null;
try {
inputStream = request.getInputStream();
// 读取输入流
SAXReader reader = new SAXReader();
SAXBuilder builder = new SAXBuilder();
Document document = builder.build(inputStream);
// 得到xml根元素
Element root = document.getRootElement();
// 得到根元素的所有子节点
List<Element> elementList = root.getChildren();

// 遍历所有子节点
for (Element e : elementList)
map.put(e.getName(), e.getText());

// 释放资源
inputStream.close();
inputStream = null;
} catch (Exception e) {
e.printStackTrace();
}
return map;
}


由于微信会不间断的通知你八次直到你返回SUCCESS给微信确保支付通知你已接收且做自己的业务处理,具体说明如下



我的做法是:当第一次通知我的时候我会去更新我的下单信息,将微信返回的微信支付订单号transaction_id更新到我业务订单表中,并返回SUCCESS,如果微信下次再来就判断transaction_id是否有值【这里需要注意的是:本地测试我们习惯打断点查看数据情况,而微信的前几次通知时间间隔都很短15秒,所以断点导致没有及时给微信返回SUCCESS,反而会看到微信通知了好几次】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: