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