Android 微信支付

微信支付...

主要分为3个阶段:

1.整合9个参数,通过签名规则生成签名.总共10个参数,以POST请求,参数为XML格式的方式,请求接口:https://api.mch.weixin.qq.com/pay/unifiedorder  获取prepay_id.

2.通过返回过来,格式为XML,拿取prepay_id和5个参数进行二次生成签名,最后将包含签名,总共6个参数调用微信支付.

3.唤起微信支付成功/失败..拿到错误码-1/-2/-3/-4


具体过程:

首先是 第一次加签的过程:


字段名 变量名 类型 描述
应用ID appid String(32) 微信开放平台审核通过的应用APPID
商户号 mch_id String(32) 微信支付分配的商户号
随机字符串 nonce_str String(32) 随机字符串,不长于32位。推荐随机数生成算法
签名 sign String(32) 签名,详见签名生成算法
商品描述 body String(128)

商品描述交易字段格式根据不同的应用场景按照以下格式:

APP——需传入应用市场上的APP名字-实际商品名称,天天爱消除-游戏充值。

商户订单号 out_trade_no String(32) 商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
总金额 total_fee Int 订单总金额,单位为分,详见支付金额
终端IP spbill_create_ip String(16) 用户端实际ip
通知地址 notify_url String(256) 接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。
交易类型 trade_type String(16) 支付类型

这10个参数都得需要...

其中签名是 根据其他9个参数按照签名规则生成的....


签名规则是:

第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:

 
 
  1. stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";

第二步:拼接API密钥:

 
 
  1. stringSignTemp="stringA&key=192006250b4c09247ec02edce69f6a2d"
  2. sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7"

要注意的是,拼接StringA字符串的时候,顺序得按照ASCII顺序来,建议放在treeMap里面...

然后生成的Sign,还得是大写...


生成签名以后,还需要将10个参数以XML格式的形式拼接起来,作为接口请求prepay_id的参数

生成XML:

 
 
  1. public static String toXml(List<namevaluepair> params) {
  2.        StringBuilder sb = new StringBuilder();
  3.        sb.append("<xml>");
  4.        for (int i = 0; i < params.size(); i++) {
  5.            sb.append("<" + params.get(i).getName() + ">");
  6.            sb.append(params.get(i).getValue());
  7.            sb.append("</" + params.get(i).getName() + ">");
  8.        }
  9.        sb.append("</xml>");
  10.        return sb.toString();
  11.    }

随机字符串:

 
 
  1. public static String genNonceStr() {
  2.        try {
  3.            Random random = new Random();
  4.            String rStr = MD5Util.getMessageDigest(String.valueOf(
  5.                    random.nextInt(10000)).getBytes("utf-8"));
  6.            return rStr;
  7.        } catch (UnsupportedEncodingException e) {
  8.            e.printStackTrace();
  9.            return null;
  10.        }
  11.    }

10个参数转换成XML以后,类似:

 
 
  1. <xml>
  2.   <appid>wx2421b1c4370ec43b</appid>
  3.   <attach>支付测试</attach>
  4.   <body>APP支付测试</body>
  5.   <mch_id>10000100</mch_id>
  6.   <nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str>
  7.   <notify_url>http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php</notify_url>
  8.   <out_trade_no>1415659990</out_trade_no>
  9.   <spbill_create_ip>14.23.150.211</spbill_create_ip>
  10.   <total_fee>1</total_fee>
  11.   <trade_type>APP</trade_type>
  12.   <sign>0CB01533B8C1EF103065174F50BCA001</sign>
  13. </xml>

就可以进行网络请求了,POST请求,请求成功,返回的结果同样是XML格式...

返回的结果,类似...

 
 
  1. <xml>
  2.   <return_code><![CDATA[SUCCESS]]></return_code>
  3.   <return_msg><![CDATA[OK]]></return_msg>
  4.   <appid><![CDATA[wx2421b1c4370ec43b]]></appid>
  5.   <mch_id><![CDATA[10000100]]></mch_id>
  6.   <nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str>
  7.   <sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign>
  8.   <result_code><![CDATA[SUCCESS]]></result_code>
  9.   <prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>
  10.   <trade_type><![CDATA[APP]]></trade_type>
  11. </xml>

请求成功,获得客户端返回的prepay_id.



然后是 二次加签的过程:

先生成一个时间戳,单位是秒,可以通过

 
 
  1. System.currentTimeMillis() / 1000 + ""

获得时间戳,数据格式是String.

再拿取返回过来的

appid(商户ID),partnerId(商户号),nonce_str(随机字符串),prepay_id(预支付会话ID),以及timestamp(时间戳),packageValue(默认值) 进行二次签名...签名规则和第一次签名一样,必须得按照ASCII顺序进行排序...

生成二次加签的签名Sign后,就可以进行唤起微信,


唤起微信支付阶段...

 
 
  1. PayReq request = new PayReq();
  2. request.appId = Constants.WX_APPID;
  3. request.partnerId = data.partnerid;
  4. request.prepayId = data.prepayid;
  5. request.packageValue = "Sign=WXPay";
  6. request.nonceStr = data.noncestr;
  7. request.timeStamp = data.timestamp+"";
  8. request.sign = data.sign;
  9. api.sendReq(request);

唤起微信支付后,微信支付完成/微信支付失败...结果都将在WXPayEntryActivity内的onResp()方法内自行处理...

  
  
  1. @Override
  2. public void onResp(BaseResp resp) {
  3. // 支付结果回调...
  4. if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
  5. if(resp.errCode == 0){
  6. //支付成功
  7. }else if(resp.errCode == -1){
  8. Toast.makeText(this,"返回-1",Toast.LENGTH_SHORT).show();
  9. }else {
  10. Toast.makeText(this,"返回-2",Toast.LENGTH_SHORT).show();
  11. }
  12. }else{
  13. WXPayEntryActivity.this.finish();
  14. }
  15. }




TIPS:

1.需要jar包...libammsdk.jar


2.需要在清单文件里面在对应的Activity配置

 
 
  1. <intent-filter>
  2.                <action android:name="android.intent.action.VIEW"/>
  3.                <category android:name="android.intent.category.DEFAULT"/>
  4.                <data android:scheme="xxxxxxxxxxxxxxxxxxx"/>
  5. </intent-filter>

在XXXXXX位置填写自己APP对应的APP_ID(APP_ID)


3.需要原封不动的在项目内建立子package,名称是wxapi.需要将官方DEMO里面的WXPayEntryActivity拷贝进去...(微信支付api调用后,支付成功后回将回调结果返回至WXPayEntryActivity.onResp()方法内)


4.需要在清单文件内声明WXPayEntryActivity,并配置...

 
 
  1. <activity android:name=".wxapi.WXPayEntryActivity"
  2.            android:exported="true"
  3.            android:launchMode="singleTop"/>

5.二次加签和调起微信支付的一个参数 packageValue = "Sign=WXPay"一定得写......

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值