新兵
新兵
  • 发布:2016-01-12 23:04
  • 更新:2016-01-12 23:04
  • 阅读:3566

关于微信支付 body设定中文签名失败

分类:5+ SDK

使用微信的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 + "&timestamp=" + 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());
2016-01-12 23:04 负责人:无 分享
已邀请:

该问题目前已经被锁定, 无法添加新回复