您的位置:首页 > 移动开发 > 微信开发

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

2016-04-05 19:28 615 查看
参考文档:微信支付统一下单- 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);}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: