移动支付的坑。微信支付-设置超时-添加time_exprie参数后-无法启动,阿里支付超时设置it_b_pay无效,

参考文档:微信支付统一下单-  https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1

微信支付:在genProductArgs方法里添加

packageParams.add(new BasicNameValuePair("time_expire", time_expire));

后微信支付无法启动

DDMS 日志的话会看到orion 字段日志显示请求返回签名错误。

 
查看文档后

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3

会看到很重要的一句话

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


我使用的微信官方demo是2015年的版本。查看里面源代码,我发现genPackageSign这段代码没有对Key Value经过排序。

/**
     * 生成签名
     */

    private String genPackageSign(List<NameValuePair> params) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < params.size(); i++) {
                sb.append(params.get(i).getName());
                sb.append('=');
                sb.append(params.get(i).getValue());
                sb.append('&');
        }
        sb.append("key=");
        sb.append(Constants.API_KEY);
        String packageSign = MD5.getMessageDigest(sb.toString().getBytes())
                .toUpperCase();
        Log.e("orion", packageSign);
        return packageSign;
    }

然后

packageParams.add(new BasicNameValuePair("time_expire", time_expire));

   String dateFormat = "yyyyMMddHHmmss";
            Calendar cal = Calendar.getInstance();
            cal.setTimeInMillis(System.currentTimeMillis());
            /**设置30分钟后超时*/
            cal.set(Calendar.MINUTE, cal.get(Calendar.MINUTE) + 30);
            Date dateinvalid = cal.getTime();
            String time_expire = new SimpleDateFormat(dateFormat).format(dateinvalid);
            packageParams.add(new BasicNameValuePair("time_expire", time_expire));
            Log.d("date", "date->" + time_expire);



解决方案:genPackageSign里添加入一段kevalue值排序,不再出现签名错误

 /**
     * 生成签名
     */

    private String genPackageSign(List<NameValuePair> params) {
        StringBuilder sb = new StringBuilder();
        Collections.sort(params, new Comparator<NameValuePair>() {
            @Override
            public int compare(NameValuePair lhs, NameValuePair rhs) {
                String key1 = lhs.getName();
                String key2 = rhs.getName();
                return key1.compareTo(key2);
            }
        });
        for (int i = 0; i < params.size(); i++) {
                sb.append(params.get(i).getName());
                sb.append('=');
                sb.append(params.get(i).getValue());
                sb.append('&');
        }
        sb.append("key=");
        sb.append(Constants.API_KEY);
        String packageSign = MD5.getMessageDigest(sb.toString().getBytes())
                .toUpperCase();
        Log.e("orion", packageSign);
        return packageSign;
    }



阿里支付 官方文档上说设置it_b_pay。经过测试

orderInfo += "&it_b_pay=\"30m\""
这段代码经过测试无效。(官方文档上说要开通超时功能,这个我没确定)

查看官方文档后,it_b_pay还支持“2016-04-05 11:00:00” 这种格式
orderInfo += "&it_b_pay=\"30m\""这段代码替换为如下代码后,设置交易超时成功。
               {
			String dateFormat = "yyyy-MM-dd HH:mm:ss";
			Calendar cal = Calendar.getInstance();
			cal.setTimeInMillis(System.currentTimeMillis());
			/**设置30分钟后超时*/
			cal.set(Calendar.MINUTE, cal.get(Calendar.MINUTE) + 30);
			Date dateinvalid = cal.getTime();
			String time_expire = new SimpleDateFormat(dateFormat).format(dateinvalid);
			orderInfo += "&it_b_pay=\""+time_expire+"\"";
			Log.d("date","date->"+time_expire);
		}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值