微信测试号授权+廖师兄支付账号调试经验分享

来源:8-3 在网页发起支付

杨勤_cd

2018-12-22

​声明:
本文分享只适合无微信公众服务号的童鞋参考。

我等穷屌丝一没公司开服务号,二没营业执照去接通微信支付,但是我们又有梦想,想要下尝试微信支付的功能,所以就得额外的费些心思了~
最终效果:手机微信可以打开sell系统,可以下单并支付成功(请自行忽略系统图片及文字内容)
图片描述

配置信息:mpAppIdTest,mpAppSecret为微信公众测试账号(所有屌丝均可免费获取),其他配置信息来源于师兄文档,openIdPro请关注“师兄干货”获取。

图片描述

项目流程分析:

1.手机登录是怎么访问到本地代码的?

答:电脑通过sell.com能访问到项目,是因为本地配置了hosts文件,电脑访问时优先从hosts文件解析域名,刚好是指向我们虚拟机的ip,所以能访问。那么手机怎么访问呢?直接输入sell.com肯定是不行的,那样只会从dns解析到对应ip,碰巧能解析到,所以手机上会看到一个长相奇怪的网站。但是我们可以考虑将手机的请求转给我们电脑,电脑再去查找hosts文件,就能访问到了。

手机通过配置代理连接到本地电脑,设置监听端口,如:8888,手机发出去的请求就会先转到本地电脑的8888端口号上,再由本地这个端口发出去;但是我们需要使用工具来监听这个端口,这里我使用的是Filder,默认监听的就是8888,但是要注意勾选允许远程机器连接,否则手机是访问不到的:

图片描述

启动Fillder后,查看8888端口,果然被Fillder监听了,证明没有问题。

win查看端口监听命令:netstat -aon|findstr “8888”

图片描述

备注:请使用Fillder安装版,因为我曾经使用免安装版,手机访问时,遇到了SocketException异常

2.为什么使用natapp域名?

答:当用户选择同意微信授权请求时,微信响应的授权数据只能传递给指定域名下的页面(设置位置:微信公众测试号平台->网页服务->网页账号->网页授权获取用户基本信息),因此我们本地的代码,想要接收这个授权数据,就必须把域名配置在微信公众号那个位置,然而你不可能将localhost配置到那里吧?他怎么知道localhost是哪个ip!所以需要一个公网,natapp可以给你一个公网域名映射到本地,从而实现上述目的。

3.授权过程:

没什么好说的,账号秘钥都使用的公众测试账号,很容易调通

如下:和师兄视频一样,唯一不同的是红框标注部分,使用师兄的openId(原因后面说)

图片描述

授权后页面重定向到:http://sell.com/#/?openid=oTgZpwb0LVceqKVS6B4Qn7CjW_mA
重定向后,前端会设置一个openId的cookie信息(理论上是这样,实际上,当我们用手机访问时,下订单的时候后台会报错:创建订单失败,openid不能为空,这是因为返回到list页面的时候,没有返回cookie信息,需要刷新下页面再次下单就可以了,至于为什么初次没有存进cookie,不太确定。初步怀疑是Fillder收到带#号格式的请求后,没有一次性转发出去?)

4.支付

支付需要mpAppId,openid,mchId,mchKey,且必须配套,也就是同一个微信号上的关联内容,前面授权的appid用的微信公众测试账号,这里支付的appId设置成师兄的appId:
图片描述

我租用的师兄账号。你可能会讲,这些账号师兄文档不都给了嘛,为什么叫租呢?
是这样的,当我们发起支付请求时,请求地址就是你前端项目此处配置的地址:

图片描述

我们最开始配置的可能是像这样的:vsmile.natapp.cc/sell/pay/create

这样没有问题,能正确运行我们本地的代码。可我们在手机端支付时,可能会遇到弹框报错:当前页面URL未注册(据说只有iphone才有报错,安卓就是一片空白,没办法,穷屌就是这个待遇),这是因为我们用到的“师兄干货”这个公众号里配置的支付授权目录是:http://proxy.springboot.cn/pay,

所以我们当前域名是没有权限去支付的。怎么解决呢?我们可以找师兄配置一下就可以了嘛,然而这个授权目录是有数量限制,貌似是5个?,就算师兄有心也无力,除非学习这门课程且是穷屌的只有5个及以下~

对于这个困惑,“师兄干货”里面已经给出了简单高效的解决方案:花钱。

注意信息要填写正确,外网地址填写完整,我填写的是:http://vsmile.natapp1.cc/sell/pay/create

图片描述

付钱以后,使用http://proxy.springboot.cn/pay 就能映射到你指定的域名了,前提是你提交的openId要正确,才能建立这个映射,这也是为什么步骤3授权中返回的openId要设置成师兄账号的openID。


总结来讲:发起支付请求>>访问前端配置支付地址(proxy.springboot.cn/pay, 如果openId正确,这个地址会映射到你指定的地址:http://vsmile.natapp1.cc/sell/pay/create)>>这个地址在微信支付授权目录下>>相关信息验证通过>>支付成功。

当前遗留问题:手机创建订单的时候必须刷新页面,才能创建成功,否则提示openId为空


以上算是纯个人理解,如果还有什么其他问题,可以留言讨论~
其实我有一个最大的困惑,为什么师兄不干脆把mpAppSecret分享出来呢,那样我们授权+支付都用师兄账号岂不省事?

写回答

3回答

廖师兄

2018-12-24

5c1f4d160001f76e13490570.jpg

这个地方应该能跳转才对,你试试不用fiddler能跳转吗?

0
0

杨勤_cd

提问者

2018-12-23

【遗留问题求助】

【问题描述】手机通过Fillder代理进入系统,选购商品并点击支付后,页面无反应;后台报错:创建订单失败,OpenId不能为空!

//img.mukewang.com/szimg/5c1f4bc90001043410520154.jpg

【初步分析】

请求授权过程中,获取accessToken的方法,即getAccessToken()的返回值能获取到:

 http://sell.com/#/?openid=oTgZpwb0LVceqKVS6B4Qn7CjW_mA,但是却不能被正确重定向,导致前端获取不到cookie的值,因此openID为空,创建订单失败,下图为该流程全部请求截图:

//img.mukewang.com/szimg/5c1f4d160001f76e13490570.jpg

创建订单请求,cookie中没有openId的值,所以报错

//img.mukewang.com/szimg/5c1f4e660001007013220614.jpg

【规避方法】手动刷新页面可以重新发出sell.com/这个请求,并获取到cookie:

//img.mukewang.com/szimg/5c1f4ee30001d2df12600551.jpg

【辅助信息】

后台相关代码:

//img.mukewang.com/szimg/5c1f4f6700011b9112160601.jpg

前台相关代码:

//img.mukewang.com/szimg/5c1f4fa600017b5608350345.jpg

//img.mukewang.com/szimg/5c1f4fbc0001704a06260316.jpg

-------------------------------------------

求告知问题出现根因,及彻底解决办法~


0
1
小鱼vv
大神,这个遗留问题你解决了?
2020-04-11
共1条回复

廖师兄

2018-12-22

有了mpAppSecret就可以修改公众号里的按钮了,还可以自定义回复消息,推送消息等等。。。

总结得非常好,注意把慕课网uid打马

0
3
廖师兄
回复
w慕莱坞
专题专答,我回答了,你去看你的问题
2018-12-24
共3条回复

Spring Boot双版本(1.5/2.1) 打造企业级微信点餐系统

从0到1开发中小型企业级Java应用,并学会迭代重构技巧

6410 学习 · 5247 问题

查看课程