微信支付方式集成(二)

本篇介绍微信支付方式的model 2


先来回顾一下model 2的流程:
1、顾客下单后点击微信支付
2、商户后台系统根据订单生成交易参数,并以XML的格式发送到统一下单API

StringBuffer xml = new StringBuffer();

        xml.append("<xml>");
        xml.append("<appid>XXXXXXXXXX</appid>");
        xml.append("<attach>微信支付</attach>");
        xml.append("<body>test</body>");
        xml.append("<mch_id>XXXXXXXXXX</mch_id>");
        xml.append("<nonce_str>" + nonceA + "</nonce_str>");
        xml.append("<notify_url>http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php</notify_url>");
        xml.append("<out_trade_no>123</out_trade_no>");
        xml.append("<product_id>123</product_id>");
        xml.append("<spbill_create_ip>127.0.0.1</spbill_create_ip>");
        xml.append("<total_fee>1</total_fee>");
        xml.append("<trade_type>NATIVE</trade_type>");
        xml.append("<sign>" + signA + "</sign>");
        xml.append("</xml>");

appid和mch_id分别为自己公司的应用ID和商户号
attach是一个字符串,会原样返回,没什么实际作用
body是商品信息,扫码成功到支付页面后会显示body的内容,但是body长度是String 32,别超长了
nonce_str是随机字符串,一下是生成随机字符串的方法:

private static String getNonce()
    {
        final String base = "abcdefghijklmnopqrstuvwxyz0123456789";
        final Random random = new Random();
        final StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 32; i++)
        {
            final int number = random.nextInt(base.length());
            sb.append(base.charAt(number));
        }
        return sb.toString();
    }

notify_url是回调URL,用于接收异步回调返回的交易结果
out_trade_no是订单号
product_id在NATIVE这种支付方式下必传,我也把他定义成订单号,
spbill_create_ip是产生订单的IP
total_fee是订单价格也是以分为单位
trade_type是交易类型,扫码支付就写NATIVE
sign是签名,下面是签名生成算法

final String nonceA = getNonce();
        final String stringA = "appid=XXXXXXXX" + "&attach=微信支付" + "&body=test"  + "&mch_id=XXXXXXX" + "&nonce_str=" + nonceA
                + "&notify_url=http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php" + "&out_trade_no=123" + "&product_id=123"  + "&spbill_create_ip=127.0.0.1" + "&total_fee=1" + "&trade_type=NATIVE";
        final String stringSignTemp = stringA + "&key=" + key;
        final String signA = MD5Util.MD5Encode(stringSignTemp, "UTF-8").toUpperCase();

StringA的最后把key,也就是密钥填写上去,调用MD5加密算法就OK,加密算法这里就不贴出来了。

下面用org.apache.commons.httpclient.methods.PostMethod去POST统一下单API
https://api.mch.weixin.qq.com/pay/unifiedorder
最后把返回结果用IO流输出:

<xml><return_code><![CDATA[SUCCESS]]></return_code>
。。。。。。。。。。中间省略
<code_url><![CDATA[weixin://wxpay/bizpayurl?sr=]]></code_url>
</xml>

3、根据code_url中的内容,也就是weixin://wxpay/bizpayurl?sr=XXXX生成二维码
4、扫码即可支付
5、支付成功后微信会将结果返回到notify_url处,该URL需要接收回调参数,参数名为result_code就是交易类型,SUCCESS表示交易成功,FAILED表示交易失败。
6、修改商户系统的订单状态


重点内容
以上参数都为必传参数
签名生成后需要转换成大写,toUpperCase
数据传输和接收格式都是XML

微信支付方式集成(二)

上一篇:Neutron 网络基本概念 - 每天5分钟玩转 OpenStack(66)


下一篇:ios微信支付 v3