微信native方式支付中body为中文时签名错误解决方法

<span style="font-family: Arial, Helvetica, sans-serif; font-size: 18px; font-weight: bold; background-color: rgb(255, 255, 255);"></span>

最近在做在做微信支付中的native支付第二种支付方式,在请求参数时遇到了最大的问题就是,body(商品描述)为中文时,签名失败,为英文时签名成功。这个问题搞了好几天,没有搞定,今天终于搞定了,特此分享一哈。其实就是一句话的问题: 把我们生成的xml请求参数转为字节数组后,用“ISO8859-1”编码格式进行编码为字符串,就可以解决问题了。

return new String(sb2.toString().getBytes(), "ISO8859-1");

=============================================================================================================

上面的已经可以解决问题。下面我只是说说更详细的解决步骤。

1. 首先我们来看看官方的接口文档:

认证方式:HTTPS讣证,退款和冲正接口调用需要商户证书(证书在审核邮件附件中)请求采用POST方式提交和返回结果采用XML格式字符集默讣使用UTF-8,请勿使用其它字符集商户不微信之间的交互(特别是Native回调和支付通知回调),都需要验证签名

4.1.统一支付接口URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder统一支付接口,可接叐JSAPI/NATIVE/APP下预支付订单,返回预支付订单号。NATIVE支付返回二维码code_url。注意:JSAPI 下单前需要调用登录授权接口(详细调用说明请点击打开链接)获叏到用户的Openid。

我们只需要传递对应的参数,请求“https://api.mch.weixin.qq.com/pay/unifiedorder”,把得到“code_url”生成二维码即可。

2. 定义个常量类用来存储请求值

我定义了一常量类,保存我们用到的参数值(这只是我的Demo,不是真实中的项目,所以这么用,真实中不能这么弄,,这个在真实中最好有服务器端操作,我们需要的只是一个"code_url"而已)。

/** * 请求需要的参数 * @author Administrator * */public class Constans {//appid public static String APPID = "wxd930ea5d5a258f4f";public static String auth_code = genNonceStr();public static String body = "霸气的小明(qiwenming)";public static String device_info = "1000";public static String mch_id = "1900000109";public static String nonce_str = genNonceStr();public static String out_trade_no = genNonceStr();public static String spbill_create_ip = "127.0.0.1";public static String notify_url = "";public static String total_fee = "1";public static String trade_type = "NATIVE";public static String private_key = "8934e7d15453e97507ef794cf7b0519d";public static String key = "L8LrMqqeGRxST5reouB0K66CaYAWpqhAVsq7ggKkxHCOastWksvuX1uvmvQclxaHoYd3ElNBrNO2DHnnzgfVG9Qs473M3DTOZug5er46FhuGofumV8H2FVR9qkjSlC5K";//请求地址public static String url="https://api.mch.weixin.qq.com/pay/unifiedorder";//生成随机字符串private static String genNonceStr() {Random random = new Random();return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());}}

3.我们组织参数,生成请求参数(XML格式 )

这里分为2步:

第一步,我们把请求参数,按字典顺序存入到一个集合中;

3.1按字典顺序存入到一个集合中:

<span style="font-size:18px;"><strong> </strong> </span><span style="font-size:14px;"> /** * 把一个参数添加到 一个集合中,按字典顺序,这是为了后面生成 签名方便 * * @return */private String genProductArgs() {List<NameValuePair> packageParams = new LinkedList<NameValuePair>();packageParams.add(new BasicNameValuePair("appid", Constans.APPID));packageParams.add(new BasicNameValuePair("appkey", Constans.key));packageParams.add(new BasicNameValuePair("body", Constans.body));packageParams.add(new BasicNameValuePair("input_charset", "UTF-8"));packageParams.add(new BasicNameValuePair("mch_id", Constans.mch_id));packageParams.add(new BasicNameValuePair("nonce_str",Constans.nonce_str));packageParams.add(new BasicNameValuePair("notify_url",""));packageParams.add(new BasicNameValuePair("out_trade_no",Constans.out_trade_no));packageParams.add(new BasicNameValuePair("spbill_create_ip",Constans.spbill_create_ip));packageParams.add(new BasicNameValuePair("total_fee", Constans.total_fee));packageParams.add(new BasicNameValuePair("trade_type",Constans.trade_type));//调用genXml()方法获得xml格式的请求数据return genXml(packageParams);}</span><span style="font-size:18px;"></span>若不给自己设限,则人生中就没有限制你发挥的藩篱。

微信native方式支付中body为中文时签名错误解决方法

相关文章:

你感兴趣的文章:

标签云: