移动支付的坑。微信支付-设置超时-添加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 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 params) {
        StringBuilder sb = new StringBuilder();
        Collections.sort(params, new Comparator() {
            @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);
		}



你可能感兴趣的:(移动开发,android,遇到问题)