使用微信的SDK
当请求支付订单的时候<body></body>之间传入中文,会出现签名错误的问题,换成英文就可以。
不知道什么问题
RequestData reqData = new RequestData();
reqData.setAppid(appid);
reqData.setBody(body);//这里是中文
reqData.setMch_id(mch_id);
reqData.setNonce_str(nonce_str);
reqData.setNotify_url(notify_url);
reqData.setOut_trade_no(out_trade_no);
reqData.setSpbill_create_ip(spbill_create_ip);
reqData.setTotal_fee(total_fee);
reqData.setTrade_type(trade_type);
sign = Signature.getSign(reqData);
reqData.setSign(sign);
// System.out.println("sign"+sign);
String result = null;
result = new HttpsRequest().sendPost(
"https://api.mch.weixin.qq.com/pay/unifiedorder",
reqData);
为了大家看的明白一些,把整个代码贴上
// 微信分配的公众账号ID(企业号corpid即为此appId)
String appid = Configure.getAppid();
// 商品或支付单简要描述
String body = "驾校车";
// 微信支付分配的商户号
String mch_id = Configure.getMchid();
// 随机字符串,不长于32位。推荐随机数生成算法
String nonce_str = RandomStringGenerator.getRandomStringByLength(32);// 必填
// 接收微信支付异步通知回调地址
String notify_url = "http://101.201.145.171/jr/app/wx/notify.do";// 必填
// 商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
String out_trade_no = request.getParameter("orderId");
// 签名,详见签名生成算法
String sign = "";
// 必填
// APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP。
String spbill_create_ip = CustomerIpUtil.getIpAddr(request);
// 必填
// 订单总金额,单位为元,详见支付金额
// Double total_fee_d = Double.parseDouble(request.getParameter("total"));
// Double total_fee_s = total_fee_d * 100;
String total_fee = request.getParameter("total") + "";
// 必填
// 取值如下:JSAPI,NATIVE,APP,详细说明见参数规定
// String trade_type = request.getParameter("trade_type");
String trade_type = "APP";
// 必填
// =============================以下参数 非必填
// ===============================
// 商品名称明细列表
String detail = "";
// 非必填
// 附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
String attach = "";
// 非必填
// 符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型
String fee_type = "";
// 非必填
// 终端设备号(门店号或收银设备ID),注意:PC网页或公众号内支付请传"WEB"
String device_info = "";
// 非必填
// 商品标记,代金券或立减优惠功能的参数,说明详见代金券或立减优惠
String goods_tag = "";
// 非必填
// 订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
String time_start = "";
// 非必填
// 订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。其他详见时间规则
// 注意:最短失效时间间隔必须大于5分钟
String time_expire = "";
// 非必填
// trade_type=NATIVE,此参数必传。此id为二维码中包含的商品ID,商户自行定义。
String product_id = "";
// 非必填
// no_credit--指定不能使用信用卡支付
String limit_pay = "";
// 非必填
// trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识。openid如何获取,可参考【获取openid】。
// 企业号请使用【企业号OAuth2.0接口】获取企业号内成员userid,再调用【企业号userid转openid接口】进行转换
String openid = "";
// 非必填
RequestData reqData = new RequestData();
reqData.setAppid(appid);
reqData.setBody(body);//问题主要在这里
reqData.setMch_id(mch_id);
reqData.setNonce_str(nonce_str);
reqData.setNotify_url(notify_url);
reqData.setOut_trade_no(out_trade_no);
reqData.setSpbill_create_ip(spbill_create_ip);
reqData.setTotal_fee(total_fee);
reqData.setTrade_type(trade_type);
sign = Signature.getSign(reqData);
reqData.setSign(sign);
// System.out.println("sign"+sign);
String result = null;
result = new HttpsRequest().sendPost(
"https://api.mch.weixin.qq.com/pay/unifiedorder",
reqData);
System.out.println(result);
Map map = XMLParser.getMapFromXML(result);
String prepay_id = (String) map.get("prepay_id");
System.out.println(prepay_id);
String timestamp = String
.valueOf(System.currentTimeMillis() / 1000);
String s = "appid=" + appid + "&noncestr=" + nonce_str
+ "&package=Sign=WXPay" + "&partnerid=" + mch_id
+ "&prepayid=" + prepay_id + "×tamp=" + timestamp
+ "&key=" + Configure.getKey();
String newSign = MD5.MD5Encode(s).toUpperCase();
StringBuffer json = new StringBuffer();
json.append("{\"appid\":\"");
json.append(appid);
json.append("\",\"noncestr\":\"");
json.append(nonce_str);
json.append("\",\"package\":\"");
json.append("Sign=WXPay");
json.append("\",\"partnerid\":\"");
json.append(mch_id);
json.append("\",\"prepayid\":\"");
json.append(prepay_id);
json.append("\",\"timestamp\":\"");
json.append(timestamp);
json.append("\",\"sign\":\"");
json.append(newSign);
json.append("\"}");
System.out.println(json.toString());
out.print(json.toString());
0 个回复