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

上一篇已经可以在微信浏览器内调出微信付款密码输入界面了,对应的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,反而会看到微信通知了好几次】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值