手机版

微信微信官方账号开发无法支付问题解决方案

时间:2021-08-28 来源:互联网 编辑:宝哥软件园 浏览:

前提:由于公司业务原因,部分核心代码无法显示。在这里,我只想谈谈如何解决微信不能在微信官方账号支付的问题。

问题:微信微信官方账号平台支付失败。

页面:一般页面如下图所示(引自《公众号支付开发者文档》中的‘微信官方账号支付’—‘场景介绍’)。您可以选择充值金额,点击立即充值,然后充值。

现象:

1.点击“立即充值”按钮,页面会显示平时微信支付的灰色加载(我只能这样描述),然后闪而过,无法进行正常充值业务;

2.该充值页面无法正常加载。显示微信上方绿色进度条瞬间加载,但无法显示正常页面,为白屏;

3.点击“立即充值”按钮,页面不会跳转,页面不会响应,页面会死亡。

故障排除步骤编号:

从这里开始,是我对整个问题的排查过程。因为涉及到三个问题,为了让顺序更清晰,这里的三大问题用阿拉伯数字(1、2、3)表示,内部流程属于1.1、1.2、1.3的形式.3.1(希望在这里得到更好的分类建议,但是没有太多时间在这里查阅文章编号规则和写论文。

故障排除和解决:

1.为解决“点击‘立即充值’按钮”的问题,页面会显示微信支付通常的灰色加载(我只能这么形容),然后闪而过,无法进行正常充值业务”。

1.1首先筛选后台日志,进入微信后台模块部署的生产环境。复制当前日志,通过vim命令查看日志,根据客服提供的充值时间进行查看,最后发现这样一个错误:

xml返回代码![CData[FAIL]]/return _ code return _ msg![CDATA[无效的out_trade_no]]/return _ msg/XML从字面意思可以看出,这是在告诉我有一个非法的订单号,于是我又一次根据这个日志记录查了一下其他的日志信息,发现了另外一个问题(除了out_trade_no用红色标注之外,其余的内容数据都被《公众号支付开发者文档》中的‘API list’-‘统一订单’替换了)

Appid=wxd678efh567hg6787body=成员充值设备_ info=013467007045764 mch _ id=1230000109 nonce _ str=5k 8264 iltkch 16 c q 2502 si 8 znmtm 67 vsnotify _ URL=http://www . weixin . QQ . m/wx pay/Pay.php OpenID=oup8 umuajo _ m2pxb 1q 9 znjwes 6 oout问题是我的订单号里出现了汉字。但在《公众号支付开发者文档》的“API List”—“统一订单”中,明确规定out_trade_no(商户订单号)必须在32个字符以内,只能是数字、大小写字母_-| *且在同一商户编号下唯一。

也就是说,我的‘订单号(out _ trade _ no)’确实出了问题;

1.2定位问题后,开始检查订单号是怎么生成的,汉字是怎么出现的。因为有日志信息,所以去后台代码根据日志信息找错代码。最后,经过调查,定位服务层业务处理类。在这个业务处理类中,这个out_trade_no已经在wxUnifiedOrder()方法中传递了。

此时考虑的是业务,充值的行为是用户行为,具体是用户点击事件,那么为什么用户点击是因为有这个按钮,这个按钮在哪里呢?首先想到这一页是很自然的。因为我们的技术使用了ionic3和cordova,所以我们会立即发现page触发的这个方法中有什么样的业务处理逻辑。直到我看到ts文件中的out_trade_no定义如下:

let out _ trade _ no=这个。datepippe。转换(新日期(),' yyymmdhmms ')XXX;从这里可以看到,当初写这个方法的人确实在规避问题,进行了格式化,但是为什么这块格式化的代码并没有起作用而是被污染了,现在我也无法理解(有的同事说新日期()方法创建的是手机本地系统时间,有的手机系统时间就是中文格式,所以这里的订单号也就出现了中文)。而且到底是前端污染还是后端格式化污染无从排查(因为找了大量公司同事进行测试,都没有发现错误订单的发生,问题重现很难[能遇上这种问题的客户,可以去买买彩票了~])。

现在先贴一下构建后端可扩展标记语言格式的代码,希望一些大神可以解释一下字符串。格式中的一些坑~

私有String buildPayXml(String appid,String body,String mch_id,String nonce_str,String notify_url,String openid,String out_trade_no,String sign,String total _ fee){ String xmlStr=String。格式(' XML ' ' appid![CDATA[%s]]/appid“”正文![CDATA[%s]]/body' 'device_info![CData[XXX]]/device _ info ' ' mch _ id![CDATA[%s]]/mch_id' 'nonce_str![CData[% s]]/nonce _ str ' ' notify _ URL![CDATA[%s]]/notify_url' 'openid![Cdata[% s]]/open id ' ' out _ trade _ no![CDATA[%s]]/out_trade_no ' '标志![CData[% s]]/签名' '总费用![CData[% s]]/total _ fee ' ' trade _ type![CData[JSAPI]]/trade _ type ' '/XML ',appid,body,mch_id,nonce_str,notify_url,openid,out_trade_no,sign,total _ fee);返回xmlStr}所以这里的问题就是这个非法订单的值是从前端传过来的还是在后端格式化错误的,由此引发出两种解决方案。

1.3 解决方案:

(1)、从前端页面进行控制,不再使用之前的的格式化时间方式,而是重新创建一个方法叫做createTradeNo():

/* * * @公司{http://www .XXX.cn/} * @作者{凯文波特} * @描述* {不要删除此方法。这种方式是针对微信不能充值的用户*数量增加的,因为这种方式之前的格式化方式可能会导致*日期格式不合法,从而导致用户*订单字符的订单数量不合法。此方法类似于硬编码效果,旨在*在创建新的日期类时强制获取数字"年、月和日",而不是通过以前的格式化方法进行错误的转换。} * @描述* {此方法请勿删除。此方法的存在是为了处理部分用户无法充值而增加的,因为此方法之前的格式化* 方法可能会出现日期格式化非法的结果,这样将会导致用户订单的订单号出现非法字符。此方法属于* 类似硬编码的效果,旨在当新建日期类时,强行获取数字型的'年月日,而不是由之前的格式化方法* 进行错误的转换} * @ param {无参数} * @返回{ String } */private createTradeNo():字符串{让现在日期=新日期();让年份:数字=datenow。getfull year();让每月:字符串| number=(datenow。getmonth()1)10?0 '(DateNow。GetMount)(1):(DateNow。GetMount)(1);让第:天字符串| number=dateNow.getDate() 10?“0”日期现在。GetDate(): DateNow。GetDate();让小时:字符串| number=datenow . gethours()' 10?0 ' datenow。gethours(): datenow。gethours();让分钟:字符串| number=dateNow.getMinutes() 10?0 ' datenow。getminutes(): datenow。getminutes().toString();让秒:字符串| number=dateNow.getSeconds() 10?0 ' datenow。getseconds(): datenow。getseconds();' let out_trade_no: string='年月日时分钟秒使用者辩证码返回out _ trade _ no}这种方式类似于硬编码的方式,就是强行获取数字型年月日时分秒等值,然后转换为字符串进行传参;

(2)从后端业务截取。截取的地方是参数传输的开始。我这里用的是网上比较常见的正则表达式,只要是数字的,别人都会:淘汰

字符串正则表达式='[^0-9]';pattern=pattern.compile(RegEx);matcher matcher=pattern . matcher(out _ trade _ no);string out radeno=matcher . replace all(')。trim();//过滤订单1.4出现后,与同事讨论后决定采用第二种方案,但第一种方案策略没有删除。如果第二个解决方案不可用,则再次采用第一个解决方案策略。在客户反馈中部署后,大部分微信充值问题已经解决(75%)。

2.解决‘页面无法正常加载,微信上方绿色进度条瞬间加载,正常页面无法显示,是白屏’的问题。

2.1首先,根据客服的反馈,我们在公司内部进行了一次测试,目的是重现问题。总共测试了20部手机。不幸的是,他们都通过了。指导硬件部门的一个人也想做测试。这时,页面是白色的。经过对比,我们发现这种情况似乎和微信昵称有关。也就是这个人的外号有特殊的符号。

这时我们的项目经理指出数据库编码有问题,特殊符号(表情符号)无法存储。然而,需要测试来重现内部问题。

2.2搭建本地测试环境并进行测试(即在微信上更改昵称并添加表情符号)。然而,经过大约四次更换,问题无法重现。之后被同事提醒后发了苹果手机的表情,再次进行测试,问题再次出现~

重新出现问题后,检查日志记录并粘贴,如下所示:

2018-04-23 22:59:06.432 INFO 120-[p-nio-80-exec-1]com。手宽休息。app。服务。微信服务: xml msg: xmlToUserName![CData[用户]]/用户名称用户名![CData[Ouf 8 umu ajo _ m2pxb 1q 9 znjwes 6o]]/来自usernamecreatetime 1524495419/CreateTimeMsgType![CData[事件]]/MSgtypevent![CData[订阅EventEventKey![Cdata[]/EventKey/XML 2018-04-23 223:59336006.521 INFO 120-[p-nio-80-exec-1]com。手宽休息。app。服务。微信服务:输入订阅{ '国家' : '中国,' qr_scene':0,' subscribe':1,' city': '朝阳,' OpenID ' : ' oupf 8 umuajo _ m2pxb1q 9 znjwes 6o ',' tagid_list':[],' sex':1,' groupid':0,' language':'zh_CN ','备注: ' ',' subscribe_time':1524495419 '省份' : '北京,' subscribe _ SCENE ' : ' ADD _ SCENE _ QR _ CODE ','昵称' : '口哈哈哈,标题imgurl ' : ' http://thirdwx。qlogo。cn/MMO pen/iaxtwdhnbibo 6 cb1h gclwsgskeiktonsan8 v 6j y6 EB 1 o 7 ibddgxxxn1 iceanzlrd 8 oiaqdwnall 1 wgqpac 3 IBD nbcqfqulvxwheshnwj 8/132 ',' QR _ scene _ str ' : ' ' } 2018-04-23 2233:0中国,' qr_scene':0,' subscribe':1,' city': '朝阳,' OpenID ' : ' oupf 8 umuajo _ m2pxb1q 9 znjwes 6o ',' tagid_list':[],' sex':1,' groupid':0,' language':'zh_CN ','备注: ' ',' subscribe_time':1524495419 '省份' : '北京,' subscribe _ SCENE ' : ' ADD _ SCENE _ QR _ CODE ','昵称' : '口哈哈哈,标题imgurl ' : ' http://thirdwx。qlogo。cn/MMO pen/iaxtwdhnbibo 6 cb1h gclwsgskeiktonsan8 v 6j y6 EB 1 o 7 ibddgxxxn1 iceanzlrd 8 oiaqdwnal 1 wgqpac 3 bdnbcqfqulvxwheshnwj 8/132 ',' QR _ scene _ str ' : ' ' } hibernate :选择userentity0_ .编号为id1_13_,userentity0_ .余额为balance2_13_,userentity0_ .优惠券为coupon3 _ 13 _,userentity0_ .信用为credit4_13_,userentity0_ .is _ admin as is _ admin5 _ 13 _,userentity0_ .is _ agent as is _ agent6 _ 13 _,userentity0_ .is _ partner as is _ partn7 _ 13 _,userentity0_ .wx_icon作为wx_icon8_13_,userentity0_ .wx_name为wx_name9_13_,userentity0_ .wx_open_id为wx_open10_13_,userentity0_ .wx_subscribe_ts as wx_subs11_13_,userentity0_ .用户userentity0_其中userentity0_的wx_subs12_13_已订阅wx_open_id=?休眠:插入用户(余额、优惠券、信用、is_admin、is_agent、is_partner、wx_icon、wx_name、wx_open_id、wx_subscribe_ts、wx_subscribed)值(? ? ?)2018-04-23 223:59336006.970 WARN 120-[p-nio-80-exec-1]o . h .发动机。JDBC。SPI。sqlexception helper : SQL ERROR : 1366,SQLSTATE : hy002018-04-23 22:59:6。9706006对于第12018-04-23行的列" wx _ name " 22:59336006.993 ERROR 120-[p-nio-80-exec-1]c . h . r . a . e . global exception handler :/rest/微信/checkSign?签名=f3c AC 2272 a B3 f 442 b 32d 8560 f 024919240 ab 96 e 1tamp=1524495419 nonce=451675791 penid=Ouf 8 umu ajo _ m2pxb 1q 9 znjwes6o;错误:无法执行语句;嵌套异常为组织。冬眠。例外。genericjdbcexception :无法执行语句2018-04-23 223:59336007.008 WARN 120-[p-nio-80-exec-1]。m . m . a . exceptionhandleexceptionresolver :已解决由处理程序执行:组织。弹簧框架。ORM。JPA。jpasystemexception :无法执行语句导致的异常;嵌套异常为组织。冬眠。例外。genericjdbcexception :无法执行语句

我们从日志显示上来看,其实就可以看出来,所有的用户信息都已正常获取,但是之后却有两个错误(红字标注部分)报错。其中第一条错误告诉我们结构化查询语言语句错误,那么第二条错误提示的更加明显(向wx_name字段插入了不正确的字符串值)。那么,从网上借鉴的解决方法来看,确实是数据库编码问题,无法存入绘文字特殊表情。

2.3 解决方案:

依据网上的解决方法,我们在测试环境下(我们使用的数据库的版本为MySQL5.6.39)修改my.cnf(Linux下为我的。窗口下为my.ini)数据库的配置文件,在下面添加(无则添加,有则修改):

[客户端]默认字符集=utf8 MB 4[MySQL]默认字符集=utf8 MB 4[MySQL]字符集-服务器=utf8 MB 4排序规则-server=utf8mb4_unicode_ci修改完数据库全局配置之后,再修改我们测试库的编码为utf8mb4,同时再修改绘文字特殊符号所存入字段wx_name的编码为utf8mb4,此时,进行本地测试,问题不再出现,之后,在生产环境同样应用上述配置,问题解决。从这里我们其实可以看出更多的问题,就是现如今,已然出现了更好的编码方式,而公司内部,依旧使用的是旧有的编码模式,而不考量日后的扩展。说的与时俱进,其实也是一种换汤不换药的死硬做法,这是我们需要警惕的。现贴出成功后的日志记录:

2018-04-23 23:07:54.218 INFO 120-[p-nio-80-exec-9]com。手宽休息。app。服务。微信服务: xml msg: xmlToUserName![CData[用户]]/用户名称用户名![CData[Ouf 8 umu ajo _ m2pxb1q 9 znjwes 6o]]/来自usernamecreatetime 1524495947/CreateTimeMsgType![CData[事件]]/MSgtypevent![CData[订阅EventEventKey![Cdata[]/EventKey/XML 2018-04-23 233:07336054.226 INFO 120-[p-nio-80-exec-9]com。手宽休息。app。服务。微信服务:输入订阅{ '国家' : '中国,' qr_scene':0,' subscribe':1,' city': '朝阳,' OpenID ' : ' oupf 8 umuajo _ m2pxb1q 9 znjwes 6o ',' tagid_list':[],' sex':1,' groupid':0,' language':'zh_CN ','备注: ' ',' subscribe_time':1524495947 '省份' : '北京,' subscribe _ SCENE ' : ' ADD _ SCENE _ QR _ CODE ','昵称' : '口哈哈哈,标题imgurl ' : ' http://thirdwx。qlogo。cn/MMO pen/iaxtwdhnbibo 6 cb1h gclwsgskeiktonsan8 v 6j y6 EB 1 o 7 ibddgxxxn 1 iceanzlrd 8 oiaqdwnall 1 wgqpac 3 IBD nbcqfqulvxwheshnwj 8/132 ',' QR _ scene _ str ' : ' ' } 2018-04-23 2333:0中国,' qr_scene':0,' subscribe':1,' city': '朝阳,' OpenID ' : ' oupf 8 umuajo _ m2pxb1q 9 znjwes 6o ',' tagid_list':[],' sex':1,' groupid':0,' language':'zh_CN ','备注: ' ',' subscribe_time':1524495947 '省份' : '北京,' subscribe _ SCENE ' : ' ADD _ SCENE _ QR _ CODE ','昵称' : '口哈哈哈,标题imgurl ' : ' http://thirdwx。qlogo。cn/MMO pen/iaxtwdhnbibo 6 cb1h gclwsgskeiktonsan8 v 6j y6 EB 1 o 7 ibddgxxxn1 iceanzlrd 8 oiaqdwnal 1 wgqpac 3 bdnbcqfqulvxwheshnwj 8/132 ',' QR _ scene _ str ' : ' ' } hibernate :选择userentity0_ .编号为id1_13_,userentity0_ .余额为balance2_13_,userentity0_ .优惠券为coupon3 _ 13 _,userentity0_ .信用为credit4_13_,userentity0_ .is _ admin as is _ admin5 _ 13 _,userentity0_ .is _ agent as is _ agent6 _ 13 _,userentity0_ .is _ partner as is _ partn7 _ 13 _,userentity0_ .wx_icon作为wx_icon8_13_,userentity0_ .wx_name为wx_name9_13_,userentity0_ .wx_open_id为wx_open10_13_,userentity0_ .wx_subscribe_ts as wx_subs11_13_,userentity0_ .用户userentity0_其中userentity0_的wx_subs12_13_已订阅wx_open_id=?休眠:插入用户(余额、优惠券、信用、is_admin、is_agent、is_partner、wx_icon、wx_name、wx_open_id、wx_subscribe_ts、wx_subscribed)值(? ? ?)

此时,微信充值问题绝大大部分解决(95%)。

3.针对'点击立即充值,页面无跳转,页面无反应,页面死活不动,死了'的问题.

关于这个问题,我们没有解决,不过现在问题定位很是明晰,这个问题的出现,99%的用户使用的是苹果手机,其版本为9抑或是9以下。关于这个问题,原谅我们能力有限,无法去解决。

问题解决,这里一笔带过,因为原因特别简单,待定服务(腾讯浏览服务)的内核基线升级,导致了有角的的在页面模板中的管道功能失效。

例如,我们在页面模板中使用的原始代码是

{ { page dto }的修改代码。balance0 | number:' 1.0-1'}}为

{{pageDto.balance}}这样就可以将后台Java要显示的值格式化并返回(我前几天做了技术培训,讲了《初探前后端分离》,表达了前后端分开最大的好处就是可以平衡压力。当然,我知道分工明确也是一个很大的优势【前者是为物,后者是为人】,但我觉得其中一个亮点就是后端只提供原始数据。

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

版权声明:微信微信官方账号开发无法支付问题解决方案是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。