微信支付开发-从零开始-Part4
2016-05-11 10:56
239 查看
上一篇已经可以在微信浏览器内调出微信付款密码输入界面了,对应的JS端有个回调函数,返回说明如下:
可以看出即使返回OK也不保证支付成功,当用户点击密码输入框左上角x关闭时会触发cancel以及fail【不必细化区分】,可在此处做支付失败的提示以及对应操作。
支付成功后微信会向下单时你提交的notify_url发送共八次的请求,该请求会返回如下信息:
由于微信会不间断的通知你八次直到你返回SUCCESS给微信确保支付通知你已接收且做自己的业务处理,具体说明如下
我的做法是:当第一次通知我的时候我会去更新我的下单信息,将微信返回的微信支付订单号transaction_id更新到我业务订单表中,并返回SUCCESS,如果微信下次再来就判断transaction_id是否有值【这里需要注意的是:本地测试我们习惯打断点查看数据情况,而微信的前几次通知时间间隔都很短15秒,所以断点导致没有及时给微信返回SUCCESS,反而会看到微信通知了好几次】
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,反而会看到微信通知了好几次】
相关文章推荐
- 基于微信的域名交易系统(分工介绍及当前成果)
- 微信web开发者工具下载 微信web开发者工具使用方法
- Android实现微信支付功能
- 微信支付遇到的坑
- 微信公众平台iPhone版内测开始了
- 微信营销没效果?因为你不懂这个这样做!
- 微信转发的技术文章
- 微信转发的技术文章
- 微信开发-添加客服错误解决
- 学习交流或者联系本人请关注微信公众帐号:极客峰
- Java微信公众号开发:网页授权获取用户基本信息
- 微信红包接龙的数学分析
- 微信开发文档
- java版微信公众号开发之自定义菜单的创建
- 微信支付步骤详解
- java 线程小程序--按时间给数组赋值
- 微信公众号开发--会员免登录操作
- 微信开发常见问题总结
- 自定义ViewGroup打造微信朋友圈之九宫图效果
- 【友盟V5.0】微信登陆后,返回的usid为空