参考文档:微信支付统一下单- 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);
/** * 生成签名 */ 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); }