微信开发常见报错及解决方法
小技巧:可能过ctrl+f 进行查找您遇到的问题。
支付方式 | 报错提示 | 解决方法 | |
热点问题 | 支付返回签名错误 | 注意签名参数的大小写,支付密钥key要到商户平台设置,设置的规则是32位数字与字母大小写的组合。以下链接为签名过程。 (https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=3_1) |
|
支付回调 | 认证后的服务号之间支持跨号支付。 | ||
支付失败 | 请检查商户号是否错误或支付密钥key设置错误。 | ||
redirect——uri参数错误 | 请进入公众平台-开发者中心,找到填写商户的支付授权域名,填写的就是商户支付授权目录上的域名。 | ||
paysinkey如何获取? | 新版的微信支付是没有这个paysignkey参数的,具体的参数请查看文档 | ||
(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=3_1) | |||
mchid是指什么? | MCHID参数指的是商户号 | ||
openid的获取请参考文档 | openid的获取请参考文档详细介绍 | ||
(http://mp.weixin.qq.com/wiki/14/bb5031008f1494a59c6f71fa0f319c66.html) | |||
openid如何获取? | openid的获取请参考文档查看详细介绍: | ||
(http://mp.weixin.qq.com/wiki/14/bb5031008f1494a59c6f71fa0f319c66.html) | |||
Appsecret如何获取? | APPsecret参数可进入公众平台(https://mp.weixin.qq.com)开发者中心查看。 | ||
调用报错 get_brand_wcpay_request:fail |
签名错误,请仔细检查签名。 | ||
spbill_create_ip 是指什么? | spbill_create_ip 指的是终端ip,在APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP。 | ||
网页支付(JSAPI) | “当前公众号没有权限支付本次交易“ | 检查该公众帐号是否已经获取了支付资格。 | |
“公众帐号支付使用了无效的商户号,无法发起该笔交易” | 检查商户号使用错误。 | ||
“该公众号支付签名无效,无法发起该笔交易” | 调起支付MD5签名的MD5签名错误,请检查相关签名。 | ||
“Args Error” | 提交JS时,josn传递参数必须与文档中名字一致,大小写匹配。 | ||
“access:not_allow” | 未设置白名单,添加位置:微信公众平台=》微信支付=》开发配置 | ||
点击支付无反应 | 支付授权目录是否正确,如果使用的是支付测试目录,是否设置了白名单,需白名单帐号进行支付测试。 | ||
ios系统可以正常支付,android系统支付失败 | timestamp字段值需要加上“”,传递数据必须为字符串类型。 | ||
调用报错 get_brand_wcpay_request:fail |
签名错误,请仔细检查签名。 | ||
调用报错: zhgj-2014+中涵国际分销商城及“订单满送红包无法送” |
商户设置有问题。 | ||
IOS系统调用支付JSAPI报错 缺少参数:$key0$,android 没问题 |
提交的参数有问题,注意全部参数都得是字符串类型。 | ||
支付验证签名失败 | 签名错误,仔细检查签名。 | ||
jsapi 缺少参数 key0 | 问题出在网页端调起支付API接口中timeStamp参数,必须是string类型,但是php默认生成的时间戳是int类型。 解决方法:修改下lib/Wxpay.Data.php约2731行处SetTimeStamp方法,修改为$this->values['timestamp'] = (string)$value; |
||
安卓手机可以收到满送红包 苹果的不行 红包虽然已经显示发送了红包但是实质资金流水没有扣除资金 | 参数错误,请仔细检查。 | ||
调用报错: 传输参数错误 |
推测为提交的支付请求参数不正确;以下文档有详细的参考。https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7 | ||
调用报错: 没有获取到微信支付预支付ID,请管理员检查微信支付配置项 |
需要按照文档要求 ,先获取prepay_id。 | ||
支付权限检查失败 | 商户所用的参数对应的APPID是APP支付;如果商户想要JSAPI支付,需要在公众平台申请公众号,公众号支付中才有此参数。 | ||
原生支付(扫码支付) | “获取商户数据失败” | 请检查申请native支付时的回调URL地址是否正确,是否可以外网访问获取数据。 | |
“商户返回数据错误” | native回调返回数据格式错误,非XML格式数据。 | ||
“签名错误” | 检查MD5签名中参数格式及值是否正确。 | ||
调用报错: 获取商户订单信息超时或商户返回httpcode非200 |
签名错误,请仔细检查签名。 | ||
错误返回:错误码:60 | 错误通过修改文件:WxPay.Api.php解决,具体如下: 第537行 curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TURE); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,2);//严格校验 to curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);//严格校验2 微信支付错误两个问题的解决:curl出错,错误码:60 |
||
APP支付 | 错误返回“-1” | 开放平台配置的报名和应用签名是否一致:(android);确认是否使用正式的keystore打包apk并安装调试;(android);提交订单部分需要在服务器端完成。 | |
下单报{"errcode":62621014,"errmsg":""} | Package数据MD5签名错误,请参照文档检查。 | ||
下单报"1001"错误 | package里缺少必要参数;金额类型为证书,单位是分。 | ||
android签名正常,ios签名错误 | 需要注意body如果是中文,需要编码,编码格式统一为“UTF-8”。 | ||
支付授权地址没有经过ICP验证 | 域名需要是英文备案域名方可。(此情况针对备案域名中包含中文字符或其他) | ||
ios系统:订单成功,无法跳转到支付界面 | 请仔细查阅参考开发文档步骤。 | ||
支付结果报错:errStr=null,code=-1 | 请检查开放平台配置的包名和签名是否跟APK安装后的包名签名一致,一致才会调用的。 | ||
支付无法调起 | 请检查开放平台配置的包名和签名是否跟你的APK安装后的包名签名一致,一致才会调用的。 | ||
需要V3版的app支付服务端demo,因获取prepayId失败,找不到app_key | 新版的微信支付是没有这个参数的,请查看最新版文档。 | ||
请求prepayid发生错误: errcode":268497023,"errmsg |
请将商户的APPID和商户号以及报错截图发送至wepayTS@tencent.com,进行深入了解。 | ||
支付返回报错: :"errcode":268497023,"errmsg":"您已完成交易接口升级,老接口交易权限已关闭,请使用新接口进行交易。如有疑问请联系微信支付客服咨询" |
请将商户的APPID和商户号以及报错截图发送至wepayTS@tencent.com,进行深入了解。 | ||
请求prepayid发生错误: 信息[{"errcode":268497023,"errmsg":"鎮ㄥ凡瀹屾垚浜ゆ槗鎺ュ彛鍗囩骇锛岃 鎺ュ彛浜ゆ槗鏉冮檺宸插叧闂紝璇蜂娇鐢ㄦ柊鎺ュ彛杩涜浜ゆ槗銆傚鏈夌枒闂鑱旂郴寰俊鏀粯瀹㈡湇鍜ㄨ"}] |
请将商户的APPID和商户号以及报错截图发送至wepayTS@tencent.com,进行深入了解。 | ||
根据文档下订单,调用微信支付失败。调用微信支付的时候,微信为登录状态则无反应;微信未登录状态,会调用微信登录界面。 | 请将商户的APPID和商户号以及报错截图+请求参数详情,发送至wepayTS@tencent.com,进行深入了解。 | ||
常见问题 | 申请正在审核中,如何可以提前调试测试? | 只需要资料审核通过,收到通知邮件即可通过配置测试目录进行联调测试。未审核通过可下载文档进行开发,但不能联调测试。 | |
支付授权目录是什么? | 支付授权目录是支付功能正式上线后,商户后台发起支付请求的页面所在的目录。 | ||
支付测试目录是什么? | 支付测试目录提供给开发者,在开发测试期间使用的临时目录。 | ||
支付测试目录和授权目录有何区别? | 支付授权目录将会在产品上线审核时,以及上线后长期使用的正式目录;测试目录只能配置白名单,才可以在公众号内发起支付。 | ||
如何配置支付目录(授权、测试)? | 登录微信公众平台-微信支付-开发配置-修改 | ||
支付目录有什么规则? | 头部需要包含http或https,须细化到二级或三级目录,字母小写,以左斜杠“/”结尾。 | ||
如何配置授权回调页面域名? | 登录微信公众平台=》开发者中心=》网页授权获取用户基本信息=》修改 | ||
微信支付接口的签名规则是如何的? | MD5签名,订单数据签名,所有传输的字段均需要参与签名,使用商户密钥key在签名字段排序后放入在最后组包签名。 | ||
“订单数据签名验证失败”如何解决? | 检查参数是否一致;是否含有特殊字符;中文编码类型是否与所传参数一致;body参数是否含空格,若有空格URLencode的时需要转为%20。 | ||
报40001错误,如何解决? | accesstoken失效或者过期,accesstoken有效期为2小时,如果有系统或者人为重新获取,前一个accesstoken也会自动消失。请保证accesstoken为全局管理,避免重复获取。 | ||
签名正常,却提示fail_invalid appid | 查看支付授权目录是否设置正确,所支付页面路径是否在支付授权目录下。 | ||
公众号是否可以跨号支付? | 两个具有支付权限的服务号之间可以跨号支付,但不可混淆appid。 | ||
支付完成,Notify URL无法接收回调通知 | 需要绝对路径,外网可访问,不支持非80端口,同时注意不要被防火墙拦截;可自行用fiddler模拟post访问是否正常。 | ||
查询订单接口报“errcode":49001,"errmsg": | 检查accesstoken是否为同一APPID获取;POST数据必须为JSON格式, | ||
"not same appid with appid of access_token"错误如何解决? | 避免格式不对导致获取APPID不一致。 | ||
支付提示“系统繁忙,请稍后再试” | 检查签名及传入参数是否与文档要求一致;尤其是MD5签名部门的正确性。 | ||
调用支付报错【特殊】 | 调用报错: “chooseWXPay:fail” |
此情况需要商户将提交的签名过程发送至邮箱:wepayTS@tencent.com,进行深入了解。 | |
调用报错: “{return_msg=支付权限检查失败, return_code=FAIL}” |
此情况需要将提交的xml发送至邮箱:wepayTS@tencent.com,进行深入了解。 | ||
zhgj-2014+中涵国际分销商城及“订单满送红包无法送” | 请将商户的APPID和商户号以及报错截图发送至wepayTS@tencent.com,进行深入了解。 | ||
微信支付完成后不能执行回调 | 请将商户的APPID和商户号以及报错截图发送至wepayTS@tencent.com,进行深入了解。 | ||
报错:不允许跨号支付 ios上没这个问题,android上有些商品有这个问题 |
是否通过订阅号发出此请求,请将APPID,商户号,报错截图及请求参数发送至wepayTS@tencent.com,进行深入了解。 |
解决PHP执行Linux命令
一、检查您的php用的是哪个用户组:
可以查看nginx配置文件或者apache配置文件
如:/etc/nginx/nginx.conf 或: /etc/httpd/conf/httpd.conf
也可以用:
比如 我的运行用户组是apache,那么,
二、
vim /etc/sudoer
1.加上www用户 www ALL=(ALL) NOPASSWD:ALL
2. vim 下 / 查找LS_COLORS 将它去掉(Ubuntu没有这个的可以省略)
然后注释掉
Defaults requiretty
Defaults env_reset
这两句!
三、
vim /etc/php.ini
检查:
safe_mode = (这个如果为off下面两个就不用管了)
disable_functions =
safe_mode_exec_dir=
done! 现在您应该可以在php跑linux命令了!
记住一定要重启php-fmp 和nginx
/etc/init.d/php-fpm restart
/etc/init.d/nginx restart
linux下mysql的root密码忘记解决方法
1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库。
因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的
状态下,其他的用户也可以任意地登录和修改MySQL的信息。可以采用将MySQL对
外的端口封闭,并且停止Apache以及所有的用户进程的方法实现服务器的准安全
状态。最安全的状态是到服务器的Console上面操作,并且拔掉网线。
2.修改MySQL的登录设置:
# vi /etc/my.cnf
在[mysqld]的段中加上一句:skip-grant-tables
例如:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
skip-grant-tables
保存并且退出vi。
3.重新启动mysqld
# /etc/init.d/mysqld restart
Stopping MySQL: [ OK ]
Starting MySQL: [ OK ]
4.登录并修改MySQL的root密码
# /usr/bin/mysql
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 3 to server version: 3.23.56
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql> USE mysql ;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> UPDATE user SET Password = password ( 'new-password' ) WHERE User = 'root' ;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 2 Changed: 0 Warnings: 0
mysql> flush privileges ;
Query OK, 0 rows affected (0.01 sec)
mysql> quit
Bye
5.将MySQL的登录设置修改回来
# vi /etc/my.cnf
将刚才在[mysqld]的段中加上的skip-grant-tables删除
保存并且退出vi。
6.重新启动mysqld
# /etc/init.d/mysqld restart
Stopping MySQL: [ OK ]
Starting MySQL: [ OK ]
skip-networking #注释掉 因为它是屏蔽掉一切TCP/IP连接
bind-address = 127.0.0.1 #它和上一个选项是异曲同工,要想远程连接,也得注释掉
2.如果以上工作都做过还是出现:
ERROR 2003 (HY000): Can't connect to MySQL server on '*.*.*.*' (113),那就得考虑防火墙的问题了,关掉防火墙/etc/rc.d/init.d/iptables stop
修改完后需要 restart mysql (/etc/init.d/mysql restart)
解决Nginx + PHP(FastCGI)遇到的502 Bad Gateway错误
由于服务器版本的不稳定,将Nginx的程序迁移到Apache执行
昨日,有朋友问我,他将Web服务器换成Nginx 0.6.31 + PHP 4.4.7(FastCGI)后,有时候访问会出现“502 Bad Gateway”错误,如何解决。
我让按照以下两个步骤去解决,最后在第2步中将FastCGI的timeout时间增加为300,问题解决:
PS:比较羡慕迅雷的Web服务器,16G内存。
1、查看当前的PHP FastCGI进程数是否够用:
netstat -anpo | grep "php-cgi" | wc -l
如果实际使用的“FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够用,需要增大。
2、部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间,例如:
http
{
......
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
......
}
......
解决struts国际化和中文问题
当今Struts框架的应用已经非常的成熟了,基本的配置我就不多说了,大家上google去搜搜就有一大堆. 最近在一次项目开发中碰到了Struts的I18N问题,我来粗略谈谈基本用法,让大家有对Struts的国际化问题有一个简略的认识.(注意,以下是在struts开发环境配置好了的情况下实现国际化的步骤,顺便解决了中文问题):
1. 设置所有JSP页面的charset为UTF-8. 即在每个JSP页面前加上<%@ page language="Java" contentType="text/html;charset=UTF-8" %>. java是通过unicode实现国际化的,然而unicode和UTF-8是一一对应的关系.
2. JSP页面里面没有硬编码的文字(即页面的文字都是从*.properties资源文件里面读出来的,用<bean:message key="keyword in property file">读取即可.) 资源文件的配置也不多说了,在web.xml里面配配就好. 下面假设英文的资源文件叫ApplicationResources_en.properties ,中文的源文件叫ApplicationResources_xx.properties(value都是中文的) . 用JDK自带的native2ascii工具把中文的资源文件里面的中文转化为为用ASCII表示的Unicode编码, 命令如下: native2ascii -encoding GBK ApplicationResources_xx.properties ApplicationResources_zh.properties . (中文操作系统里面默认是GBK,它是gb2312的扩充集),好了,如果你不用form传中文,不用入库,那么你成功了.打开浏览器在internet选项里面设置一下语言试试. 容易吧,呵呵. 下面的步骤涉及到入库问题.
3. 写一个Filter类,一个最简单的代码例子如下:
import java.io.*;
import javax.servlet.*;
public class CharsetFilter implements Filter{
private FilterConfig config = null;
private String defaultEncode = "UTF-8";
public void init(FilterConfig config) throws ServletException {
this.config = config;
if(config.getInitParameter("Charset")!=null){
defaultEncode=config.getInitParameter("Charset");
}
}
public void destroy() {
this.config = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
ServletRequest srequest=request;
srequest.setCharacterEncoding(defaultEncode);
chain.doFilter(srequest,response);
}
}
然后你需要在web.xml里面设置一下Filter,加入下面的即可(注意,如果你是在JBX里面开发,声明filter一定要在声明<servlet>前面,否则会报错,但是用的时候好像又没有问题.)
<filter>
<filter-name>Character Encoding</filter-name>
<filter-class>com.alex.util.CharsetEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Character Encoding</filter-name>
<servlet-name>action</servlet-name>
</filter-mapping>
4. 接下来是写一个Converter类,在入库前调用encode(),出库的时候调用decode()就ok. 下面是一个简单例子:
public class Converter {
public Converter() {
}
public static String enCode(String str) {
byte temp [];
temp = str.getBytes();
try {
//System.out.println("in before convert: " + str);
str = new String(temp , "ISO-8859-1");
//System.out.println("in after convert: " + str);
}
catch(Exception e) {
System.err.println("convert error: " + e);
}
return str;
}
public static String deCode(String str) {
byte temp [];
try {
//System.out.println("out before convert: " + str);
temp = str.getBytes("ISO-8859-1");
str = new String(temp,"GBK");
//System.out.println("out after convert: " + str);
}
catch(Exception e) {
System.err.println("convert error: " + e);
}
return str;
}
}
5. 应该都OK了吧,我就这样解决了struts的中文问题和国际化问题.