帖子说明:结合本人刚做的微信支付版本出现的各种问题,做过小总结, 也给后面做支付的朋友一点借鉴。 大神勿喷!一、准备工作
按照微信支付的配置说明,配置支付授权目录有几个需要主意的地方
1.如果发起微信支付的jsp文件路径为 http://www.xxxx.com/wxtest/test/pay.jsp 授权目录配置为http://www.xxxx.com/wetest/test/
2.授权目录的配置也可以为路由路径的方式: 比如http://www.xxxx.com/order/wxOrderPay/
3.添加测试目录 添加支付白名单。
4.公众号设置 功能设置 里面设置 js接口安全域名 需要备案的一级域名。
5.开发者中心 网页授权获取用户信息 接口 设置 授权回调页面域名
6.登录微信商户平台 下载证书 更改API密钥 32位的密钥 不能自己填写,要工具生成。
二、开发中的重要步骤。三次签名
第一次签名获取 prepayId 的参数
TreeMap<String, String> contentMap = new TreeMap<String, String>();
contentMap.put("appid", ConstantUtil.APP_ID); // 公众账号 ID
contentMap.put("mch_id", ConstantUtil.MECH_ID); // 商户号
contentMap.put("nonce_str", noceStr); // 随机字符串
contentMap.put("body", "test"); // 商品描述
contentMap.put("out_trade_no",out_trade_num); // 商户订单号
contentMap.put("total_fee",total_fee); // 订单总金额
contentMap.put("spbill_create_ip",InetAddress.getLocalHost().getHostAddress()); // 订单生成的机器IP
contentMap.put("notify_url","http://www.xxxx.com/wxpay/payNotifyUrl.jsp"); // 通知地址
contentMap.put("trade_type","JSAPI"); // 交易类型
contentMap.put("openid",openid); // 微信的用户标识
//这里开始拼接String1的并md5签名 第一次签名 将map里面的数据进行自然排序,然后再后面拼接上key=API密钥(你在商户平台自己设置的那个32位密钥)
//然后MD5加密并转换大写字母。
String sign= WeiXinSignAndPackage.createPackage(contentMap);
//得到的签名放入map用来获取prepayId
contentMap.put("sign", sign);
String result=WeiXinSignAndPackage.getPrepayId(contentMap);//调用统一支付接口返回的值
Map<String,String> map=XMLUtil.doXMLParse(result);//调用统一接口返回的值转换为XML格式
TreeMap<String, String> wxPayParamMap = new TreeMap<String, String>();
wxPayParamMap.put("appId", ConstantUtil.APP_ID);
wxPayParamMap.put("timeStamp",tempstamp );
wxPayParamMap.put("nonceStr",noceStr);
wxPayParamMap.put("package", "prepay_id="+map.get("prepay_id"));
wxPayParamMap.put("signType", "MD5");
//使用appId timeStamp noceStr package signType 进行第二次支付签名 方法跟第一次一样
String paySign=WeiXinSignAndPackage.createPaySign(wxPayParamMap);//支付得到的签名
wxPayParamMap.put("paySign", paySign);
wxPayParamMap.put("payMoney", total_fee);//到前段显示使用,支付不需要此参数
//现在js调用支付的参数就全了 第三次签名是在jsp页面注入权限时候用到的 jsp页面的wx.config需要的签名为
//进行第三次签名 wx.config需要的签名参数
//jsjdk 里面有说明 先获取ticket token和ticket 需要缓存起来 两个小时内有效。
String ticket=AccessTokenRequestHandler.getJDKStr();
String singUrl = "http://www.xxxx.com/weixinOrder/payOrderWX?orderId="+orderId+"&" +
"code="+code+"&state=111";
String params = "jsapi_ticket="+ticket+"&noncestr="+wxPayParamMap
.get("nonceStr")+"×tamp="+wxPayParamMap
.get("timeStamp")+"&url="+singUrl;
String appsign = Sha1Util.getSha1(params);
特别说明:这里参加签名的singUrl 必须填写正确,否则肯定会签名错误,它的值如果不知道到底填写哪个路径,你可以在jsp页面alert一下
alert(location.href.split('#')[0]);
按照微信支付的配置说明,配置支付授权目录有几个需要主意的地方
1.如果发起微信支付的jsp文件路径为 http://www.xxxx.com/wxtest/test/pay.jsp 授权目录配置为http://www.xxxx.com/wetest/test/
2.授权目录的配置也可以为路由路径的方式: 比如http://www.xxxx.com/order/wxOrderPay/
3.添加测试目录 添加支付白名单。
4.公众号设置 功能设置 里面设置 js接口安全域名 需要备案的一级域名。
5.开发者中心 网页授权获取用户信息 接口 设置 授权回调页面域名
6.登录微信商户平台 下载证书 更改API密钥 32位的密钥 不能自己填写,要工具生成。
二、开发中的重要步骤。三次签名
第一次签名获取 prepayId 的参数
TreeMap<String, String> contentMap = new TreeMap<String, String>();
contentMap.put("appid", ConstantUtil.APP_ID); // 公众账号 ID
contentMap.put("mch_id", ConstantUtil.MECH_ID); // 商户号
contentMap.put("nonce_str", noceStr); // 随机字符串
contentMap.put("body", "test"); // 商品描述
contentMap.put("out_trade_no",out_trade_num); // 商户订单号
contentMap.put("total_fee",total_fee); // 订单总金额
contentMap.put("spbill_create_ip",InetAddress.getLocalHost().getHostAddress()); // 订单生成的机器IP
contentMap.put("notify_url","http://www.xxxx.com/wxpay/payNotifyUrl.jsp"); // 通知地址
contentMap.put("trade_type","JSAPI"); // 交易类型
contentMap.put("openid",openid); // 微信的用户标识
//这里开始拼接String1的并md5签名 第一次签名 将map里面的数据进行自然排序,然后再后面拼接上key=API密钥(你在商户平台自己设置的那个32位密钥)
//然后MD5加密并转换大写字母。
String sign= WeiXinSignAndPackage.createPackage(contentMap);
//得到的签名放入map用来获取prepayId
contentMap.put("sign", sign);
String result=WeiXinSignAndPackage.getPrepayId(contentMap);//调用统一支付接口返回的值
Map<String,String> map=XMLUtil.doXMLParse(result);//调用统一接口返回的值转换为XML格式
TreeMap<String, String> wxPayParamMap = new TreeMap<String, String>();
wxPayParamMap.put("appId", ConstantUtil.APP_ID);
wxPayParamMap.put("timeStamp",tempstamp );
wxPayParamMap.put("nonceStr",noceStr);
wxPayParamMap.put("package", "prepay_id="+map.get("prepay_id"));
wxPayParamMap.put("signType", "MD5");
//使用appId timeStamp noceStr package signType 进行第二次支付签名 方法跟第一次一样
String paySign=WeiXinSignAndPackage.createPaySign(wxPayParamMap);//支付得到的签名
wxPayParamMap.put("paySign", paySign);
wxPayParamMap.put("payMoney", total_fee);//到前段显示使用,支付不需要此参数
//现在js调用支付的参数就全了 第三次签名是在jsp页面注入权限时候用到的 jsp页面的wx.config需要的签名为
//进行第三次签名 wx.config需要的签名参数
//jsjdk 里面有说明 先获取ticket token和ticket 需要缓存起来 两个小时内有效。
String ticket=AccessTokenRequestHandler.getJDKStr();
String singUrl = "http://www.xxxx.com/weixinOrder/payOrderWX?orderId="+orderId+"&" +
"code="+code+"&state=111";
String params = "jsapi_ticket="+ticket+"&noncestr="+wxPayParamMap
.get("nonceStr")+"×tamp="+wxPayParamMap
.get("timeStamp")+"&url="+singUrl;
String appsign = Sha1Util.getSha1(params);
特别说明:这里参加签名的singUrl 必须填写正确,否则肯定会签名错误,它的值如果不知道到底填写哪个路径,你可以在jsp页面alert一下
alert(location.href.split('#')[0]);
OK 签名没问题,授权目录没问题,微信支付就没问题了,微信支付开发请详读jssdk说明文档。调用支付的方法就是 wx.config chooseWXPay 按照jssdk的说明一步步来。
如果还是有问题 121757925可以加qq咨询!
如果解决了您的问题,可以的话 请支付宝打赏点小钱,整理出来也蛮费劲的,3Q