微信支付验证签名失败支付签名验证失败怎么办

请尊重知识,请尊重原创 更多资料参考请见
/listFilm?page=1&areaId=906&filmTypeId=1 微信app支付 签名错误 以及 访问https 的解决办法微信支付的接口不同于支付宝等其他第三方接口足够友好,所以这里有必要对 微信签名错误和访问https接口做一些小结以供参考。签名错误:
首先总结原因,可能发生签名错误的原因如下: 1 密钥错误,密钥是32位长的一串字符,类似于 f0fnf5872825aien55end044e092le39 ,如果需要重新设置 ,位置在 设置位置:账户设置-安全设置-API安全 2 本地签名程序
基本遵照微信官方文档说明即可 https://pay./wiki/doc/api/app.php?chapter=4_3传递哪些参数 需要根据文档说明 https://pay./wiki/doc/api/app.php?chapter=9_1参考(内部的一些关键参数只提供参考,位数不对): sb
appid=wxf6e555f&body=Corsair Neutron Series GTX 480GB 固态硬盘&mch_id=1&nonce_str=1BF9DEA12 &notify_url=/pay/notify&out_trade_no =857821&spbill_create_ip=10.244.1.171&total_fee=84462&trade_type=APP&key=f0fn3fen55end044e092le39 再对此字符串进行md5加密之后调成大写,即为sign签名 生成的xml文档:&xml&&appid&wxf6e555f&/appid&&body&&![CDATA[Corsair Neutron Series GTX 480GB 固态硬盘]]&&/body&&mch_id&1&/mch_id&&nonce_str&1BF9DEA12&/nonce_str&&notify_url&/pay/notify&/notify_url&&out_trade_no&857821&/out_trade_no&&sign&&![CDATA[CD0DCCA447A6C0BA545A0BA]]&&/sign&&spbill_create_ip&10.244.1.171&/spbill_create_ip&&total_fee&84462&/total_fee&&trade_type&APP&/trade_type&&/xml&生成的xml是提交给 微信的参数,必须和签名的字符串里的值相同 如果返回的微信参数提示 签名错误,可以到微信官方测试测试地址测试https://pay./wiki/tools/signverify/ 微信返回信息中,如果出现签名错误,可以把自己的资料填写在上面的测试用例中获取微信生成的签名, 如果测试sign与自己生成的不同 返回上步检查,如果微信生成的和自己生成的签名相同,但是微信还是返回签名错误,则一定是商品中文(body)编码。 有几个地方的编码必须注意. 设置 sb
字符串 的时候 body一定为utf-8,sb字符串md5加密的时候 必须为utf-8, 传递给 微信的时候 ,此参数也必须为 utf-8 :entity = new StringEntity(xml,"utf-8");httpclient 头部和参数 也设置成utf-8:httpPost.setEntity(entity);
httpPost.addHeader("Content-Type", "text/charset=UTF-8");
httpClient.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8");httpPost.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8"); 这几个编码优先级逐步提高,也就是说后面的会覆盖前面的。
请尊重知识,请尊重原创 更多资料参考请见
/listFilm?page=1&areaId=906&filmTypeId=1 由于微信的接口是https,在生产环境又只能通过代理访问,所以通常的http接口访问会返回错误信息:WARN,http-apr-9002-exec-4,10-22 20:21:30.393,httpclient.HttpMethodDirector.authenticateHost:288 - Required credentials not available for BASIC &any realm&@api.mch.:443WARN,http-apr-9002-exec-4,10-22 20:21:30.393,httpclient.HttpMethodDirector.authenticateHost:290 - Preemptive authentication requested but no default credentials availableINFO,http-apr-9002-exec-4,10-22 20:21:30.583,httpclient.HttpMethodDirector.executeWithRetry:439 - I/O exception (java.net.ConnectException) caught when processing request: Connection refusedINFO,http-apr-9002-exec-4,10-22 20:21:30.583,httpclient.HttpMethodDirector.executeWithRetry:445 - Retrying requestINFO,http-apr-9002-exec-4,10-22 20:21:30.591,httpclient.HttpMethodDirector.executeWithRetry:439 - I/O exception (java.net.ConnectException) caught when processing request: Connection refusedINFO,http-apr-9002-exec-4,10-22 20:21:30.592,httpclient.HttpMethodDirector.executeWithRetry:445 - Retrying requestINFO,http-apr-9002-exec-4,10-22 20:21:30.594,httpclient.HttpMethodDirector.executeWithRetry:439 - I/O exception (java.net.ConnectException) caught when processing request: Connection refusedINFO,http-apr-9002-exec-4,10-22 20:21:30.595,httpclient.HttpMethodDirector.executeWithRetry:445 - Retrying requestjava.net.ConnectException: Connection refusedat java.net.PlainSocketImpl.socketConnect(Native Method)at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)at java.net.Socket.connect(Socket.java:579)at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:618)at com.legendshop.model.app.wxpay.MySSLProtocolSocketFactory.createSocket(MySSLProtocolSocketFactory.java:92)at mons.httpclient.HttpConnection.open(HttpConnection.java:707)这是因为代理访问被微信拒绝,所以需要重新设置访问程序:StringEHttpResponse httpRint proxyPortCon = 0;DefaultHttpClient httpClient = new DefaultHttpClient(); //创建默认的httpClient实例try {entity = new StringEntity(xml,"utf-8");if("true".equalsIgnoreCase(useProxy) ){
X509TrustManager xtm = new X509TrustManager(){
//创建TrustManager
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
public X509Certificate[] getAcceptedIssuers() { }
X509HostnameVerifier hostnameVerifier = new X509HostnameVerifier() {
public boolean verify(String arg0, SSLSession arg1) {
public void verify(String arg0, SSLSocket arg1) throws IOException {}
public void verify(String arg0, String[] arg1, String[] arg2) throws SSLException {}
public void verify(String arg0, X509Certificate arg1) throws SSLException {}
//TLS1.0与SSL3.0基本上没有太大的差别,可粗略理解为TLS是SSL的继承者,但它们使用的是相同的SSLContext
SSLContext ctx = SSLContext.getInstance("TLS");
//使用TrustManager来初始化该上下文,TrustManager只是被SSL的Socket所使用
ctx.init(null, new TrustManager[] { xtm }, null);
//创建SSLSocketFactory
SSLSocketFactory socketFactory = new SSLSocketFactory(ctx);
socketFactory.setHostnameVerifier(hostnameVerifier);
//通过SchemeRegistry将SSLSocketFactory注册到我们的HttpClient上
httpClient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", socketFactory, 443));
proxyPortCon = Integer.parseInt(proxyPort);
HttpHost proxy = new HttpHost(proxyHost, proxyPortCon);
httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
HttpPost httpPost = new HttpPost(unifiedorder);
//创建HttpPost
httpPost.setEntity(entity);
httpPost.addHeader("Content-Type", "text/charset=UTF-8");
httpClient.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8");
//httpPost.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8");
httpResponse = httpClient.execute(httpPost); //执行POST请求
if (AppUtils.isNotBlank(httpResponse)) {HttpEntity httpEntity = httpResponse.getEntity();String result = EntityUtils.toString(httpEntity, "UTF-8");}
下面贴一些代码 供参考: app前段调用微信统一下单接口/** * 微信支付统一下单接口 * @param orderInfoJson 请求参数json
* @return * @throws UnsupportedEncodingException
*/@RequestMapping(value = "/pay/unifiedorder", method =RequestMethod.POST)@ResponseBodypublic
Result getOrderInfo(HttpServletRequest request, HttpServletResponse response,@RequestParam("code") String code, @RequestParam("orderInfoJson") String orderInfoJson) throws UnsupportedEncodingException {Result result =//日志记录("orderInfoJson is {}", orderInfoJson);AppServiceLog.visit(AppInterfaceEnum.WECHAT_PAY, "/pay/unifiedorder", getUserName(request));Map&?, ?& paramMap=JsonToMap.getBody(orderInfoJson);final Gson gson =new Gson();WXPrepayVO orderInfo = gson.fromJson(gson.toJson(paramMap),WXPrepayVO.class);WXPrepay prePay = new WXPrepay();//获取订单信息result = orderService.payUnifiedorder(request,orderInfo,prePay);}服务器构造对象 向微信服务器发起https访问,以获取预支付idpublic Result payUnifiedorder(HttpServletRequest request,WXPrepayVO orderInfo,WXPrepay prePay) throws UnsupportedEncodingException {Result result = new Result();Double totalAmount = new Double(0);OrderTemp orderTemp = orderTempDao.getOrderByOrderNum(orderInfo.getOut_trade_no());Order order =if(AppUtils.isBlank(orderTemp)){order = orderDao.getOrderByOrderNumLimitOne(orderInfo.getOut_trade_no());if(AppUtils.isNotBlank(order)){totalAmount = order.getTotalAmount();}}else{totalAmount = orderTemp.getTotalAmount();}if(AppUtils.isBlank(orderTemp) && AppUtils.isBlank(order)){result.setCode(ReturnCode.orderIsNotExist.value());result.setMessage(ReturnCode.orderIsNotExist.desc());}//商品描述String bodyStr = Base64Decoder.Decoder(orderInfo.getBody());String spbill_create_ip = request.getRemoteAddr();prePay.setAppid(appId);prePay.setBody(bodyStr);prePay.setPartnerKey(appKey);prePay.setMch_id(mchId);prePay.setNotify_url(notifyUrl);prePay.setOut_trade_no(orderInfo.getOut_trade_no());prePay.setSpbill_create_ip(spbill_create_ip);DecimalFormat df = new DecimalFormat("#");prePay.setTotal_fee(df.format(totalAmount * 10 * 10));//prePay.setTotal_fee("1");prePay.setTrade_type(PayTypeEnum.WX_APP_PAY.value());//代理String useProxyConfig = PropertiesUtil.getUseProxy();String proxyHostConfig = PropertiesUtil.getProxyHost();String proxyPortConfig = PropertiesUtil.getProxyPort();
//此处添加获取openid的方法,获取预支付订单需要此参数!!!!!!!!!!! // 获取预支付订单号WePayResponse wePayResponse = prePay.submitXmlGetPrepayId(useProxyConfig,proxyHostConfig,proxyPortConfig);wePayResponse.setPartnerId(mchId);wePayResponse.setPackageS("Sign=WXPay");wePayResponse.setNonceStr(OrderUtil.CreateNoncestr());wePayResponse.setTimeStamp(new Date().getTime());if(wePayResponse.getResultCode().equals("SUCCESS")){result.setCode(ReturnCode.OK.value());result.setMessage(wePayResponse.getReturnMsg());result.setSuccess(true);}else{result.setMessage(wePayResponse.getErrCodeDes());}result.setObject(wePayResponse);}/** * 生成预支付订单 *
* @return * @throws UnsupportedEncodingException
*/@SuppressWarnings("deprecation")public WePayResponse submitXmlGetPrepayId(String useProxy,String proxyHost,String proxyPort) throws UnsupportedEncodingException {System.out.println(useProxy +"--"+ proxyHost +"---"+ proxyPort);String xml = getPackage();WePayResponse response =StringEHttpResponse httpRint proxyPortCon = 0;DefaultHttpClient httpClient = new DefaultHttpClient(); //创建默认的httpClient实例try {entity = new StringEntity(xml,"utf-8");if("true".equalsIgnoreCase(useProxy) ){/**下面这段代码 用来处理访问https的请求**/
X509TrustManager xtm = new X509TrustManager(){
//创建TrustManager
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
public X509Certificate[] getAcceptedIssuers() { }
X509HostnameVerifier hostnameVerifier = new X509HostnameVerifier() {
public boolean verify(String arg0, SSLSession arg1) {
public void verify(String arg0, SSLSocket arg1) throws IOException {}
public void verify(String arg0, String[] arg1, String[] arg2) throws SSLException {}
public void verify(String arg0, X509Certificate arg1) throws SSLException {}
//TLS1.0与SSL3.0基本上没有太大的差别,可粗略理解为TLS是SSL的继承者,但它们使用的是相同的SSLContext
SSLContext ctx = SSLContext.getInstance("TLS");
//使用TrustManager来初始化该上下文,TrustManager只是被SSL的Socket所使用
ctx.init(null, new TrustManager[] { xtm }, null);
//创建SSLSocketFactory
SSLSocketFactory socketFactory = new SSLSocketFactory(ctx);
socketFactory.setHostnameVerifier(hostnameVerifier);
//通过SchemeRegistry将SSLSocketFactory注册到我们的HttpClient上
httpClient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", socketFactory, 443));
/****下面这段代码 使用代理访问https外部接口****/
proxyPortCon = Integer.parseInt(proxyPort);
HttpHost proxy = new HttpHost(proxyHost, proxyPortCon);
httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
HttpPost httpPost = new HttpPost(unifiedorder);
//创建HttpPost
httpPost.setEntity(entity);
httpPost.addHeader("Content-Type", "text/charset=UTF-8");
httpClient.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8");
//httpPost.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, "UTF-8");
httpResponse = httpClient.execute(httpPost); //执行POST请求
if (AppUtils.isNotBlank(httpResponse)) {HttpEntity httpEntity = httpResponse.getEntity();String result = EntityUtils.toString(httpEntity, "UTF-8");// 过滤result = result.replaceAll("&![CDATA[|]]&", "");String prepay_id = Jsoup.parse(result).select("prepay_id").html();String trade_type = Jsoup.parse(result).select("trade_type").html();String returnCode =
Jsoup.parse(result).select("return_code").html();String returnMsg =
Jsoup.parse(result).select("return_msg").html();String resultCode = Jsoup.parse(result).select("result_code").html();String errCode =
Jsoup.parse(result).select("err_code").html();String errCodeDes =
Jsoup.parse(result).select("err_code_des").html();response = WePayResponse.newInstance();response.setPrepayId(prepay_id);response.setTradeType(trade_type);response.setReturnCode(returnCode);response.setReturnMsg(returnMsg);response.setResultCode(resultCode);response.setErrCode(errCode);response.setErrCodeDes(errCodeDes);if (response != null)}// 释放资源} catch (Exception e) {e.printStackTrace();}}
最新教程周点击榜
微信扫一扫微信支付中文签名错误-爱编程
微信支付中文签名错误
最近因为公司需要,要做一个微信支付,碰到一个签名的问题。 折腾了我两天,郁闷呀
1、先说一下,签名的问题,按照规则排序就不说了,最后说一下编码 &
data=new String( data.getBytes( "UTF-8"),"ISO8859-1" );&
2、第二个是重点
这个也是对的,关键是这个改完了,还签名错误 最奇葩的是junit 单元测试时过了的,但是 在生产环境中,就是有问题。然后就是各种折腾,首先还是测试,把中文换掉,OK的,说明还是编码的问题。然后再检查httpclient ,提交时候的编码,各种比对,问题以后。后来发现,在没有提交的时候,签名已经有问题了,比对内容,UE,然后人眼比对,各种无奈呀,最后,直接两个str equals,居然是true ,然后傻脸了,最后就是想tomcat 和junit 有什么不同,既然是java ,那么默认的肯定是UTF-8,一个噢然的机会,撇了一个签名函数 Md5 签名的参数是 byte ,需要把 String 转为byte ,然后就改了.getBytes("UTF-8") ,然后就OK了 ,后来就像这个问题。
在junit &下 str.getBytes()==str.getBytes("UTF-8")
在tomcat7 下str.getBytes()==str.getBytes("GBK"),
tomcat 版本是 7 &&
不是说java 默认下都是UTF-8 么,为什么会这样呢?
版权所有 爱编程 (C) Copyright 2012. . All Rights Reserved.
闽ICP备号-3
微信扫一扫关注爱编程,每天为您推送一篇经典技术文章。匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。

我要回帖

更多关于 ios 支付验证签名失败 的文章

 

随机推荐