移动支付的坑。微信支付-设置超时-添加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);}
相关文章推荐
- 类似微信图片选择器-MultiImageSelector
- 微信公众号从头开发(接入与消息)
- 解决微信底部弹出输入法遮挡页面
- 微信支付的支付金额计算
- 微信公众帐号开发教程第14篇-自己定义菜单的创建及菜单事件响应
- 微信支付调用JSAPI缺少参数:timeStamp
- 微信公众号内支付(三)
- Android小程序-Walker注册页面(二)
- 微信公众号内支付(二)
- 微信公众号内支付(一)
- 如何把微信朋友圈的小视频转发到自己的朋友圈
- 微信刷卡支付_windows server上中文导致签名失败的解决办法
- Android 实现类似微信客户端朋友圈更新提示的小红点&栏目订阅
- 仿微信评论(部分实现)
- 微信,还有多少可能?
- 微信精选——上拉加载
- 微信开发之工具类
- 微信js-sdk,选择图片,上传,下载到本地,php服务端
- 关于微信支付由H5页面修改为类似于微信支付手机充值的效果
- 很难吗?教你三天精仿一个跨平台的微信