最近项目进入中后期,开始接入支付。要求是使用微信支付,呵呵,好笑的是不知老板从哪里听来的,居然和我说只要是熟手,接个微信支付两小时搞定,我只能再次呵呵。先不说支付处理逻辑,而且公司本来也没现成的接入模块,再加上我对国内SDK的文档水平,我只能说,前途必定是暗坑无数,还两小时,除非是有现成接入模块,外加不用写支付后处理逻辑,配配参数了事的那种,否则哪有那么简单。(如有大神两小时内从无到有做完整个接入,加游戏相关处理逻辑,而且调式完成,请收下我的膝盖!)

好了,扯远了。进入正题。首先,这篇文章介绍的是H5游戏“移动”端接入。为什么要在这强调移动端,因为这里就有一个微信的暗坑!

支付方式

微信支付方式分类很混乱,我归纳如下 
 
图中,斜体的代表微信官方对其支付的渠道分类,红色的因为我没接过扫码,和刷卡,不确定我这样分类是否正确,所以下面就不讨论扫码和刷卡形式了。

可以看到,其实微信支付分量大类,一类是移动端APP支付,这个很好理解。另一大类就是公众号支付,我们平时使用的一些第三方APP,网站中的微信支付,其实都是公众号支付(貌似现在还有个微信买单,也是在公众号之下的支付)。公众号支付,其实都是通过H5网页形式实现(扫码,刷卡,不在讨论范围,以下同)。然后同样是访问H5网页形式支付,微信分成两种,一种是再微信内,也就是使用微信浏览器支付,另一种是微信外,也就是非微信浏览器然后调起微信客户端APP进行支付。

讲了这么多,是想告诉大家,选择正确的支付方式,很重要,很重要,很重要!

实践中遇到的问题

我接入的时候,就因为没有太过注意,而导致被微信狠狠坑了一把

坑1:非APP支付和开放平台没有关系

在接H5之前,我们刚好接过一个APP支付,所以接H5时,没有多想,去微信开放平台注册相关的信息,又是提交资料,又是等待审核,不亦乐乎。结果审核一通过,傻眼了,没有支付接口,只有登录接口。然后看支付文档,发现支付时好多参数都是和公众号有关的,然后又以为是要先申请公众号支付,然后进行某种绑定,然后再屁颠颠的去申请公众号支付,提交资料,等待审核。通过后开始接API。知道API调用后才发现,晕倒!实际H5网页支付根本就不用申请开放平台。开放平台申请的appid,密钥,在支付这块根本没用。

开放平台的AppId和密钥只对授权登录,获取openId有用,而且只有在你不接支付的时候,才可以使用开放平台的授权登录,因为支付的时候,用户的openId是要靠公众号授权的

也就是说,如果你要接支付,那么其实根本不用去开放平台申请一个网站应用,因为支付时的openid根本不是由这个应用的appid和密钥获取,而是用公众号的appid和密钥获取。也许是我对开发文档理解不够透彻,但我真的想吐槽,微信不能在开放平台申请之前就告诉我没有支付接口吗,不能在开放文档中清楚的提醒我们,网站应用实际是用公众号支付,不能清楚的告诉我们网站应用的openid不能用来公众号支付么?

坑2:trade_type

前面已经说了,如果要做网页支付,只能用公众号H5方式,不用在开放平台申请网站应用。然后,其实这事没完,刚跳出一个巨坑,瞬间又进入一个坑(只能说我们同行的写文档水平都真的一般,国内国外的通病,反正大部分文档写的只有自己看的懂,别人看的云里雾里和我们没关系,我也是这样吧,所以努力把文档写的明白点)。

我当时看,不是H5支付么,那么就去到微信支付商户平台看文档,我们从如下图入口进入 

然后看到如下的界面 

注意红框标出来的话,这里的意思是,如果你要获得H5支付能力,还要进一步申请!发送到指定邮箱,这个申请算是半开放的那种。我当时虽然看到这段话,但是没有多想,急不可待去看API调用了,事实证明,在这个文档里的一系列接入方式其实和真正的微信接入方式非常相似,但是它会让你把trade_type填成MWEB,结果,就杯具了,显示”商户无该产品开通权限”。网上有不少人遇到这个问题,答案都是让大家检查代码,检查公众号设置,但往往设置,代码都是对的。其实就是这个东西惹的祸,因为在你没有进一步申请之前,MWEB这个方式是不能通过的。另外,这个文档在获取登录openid时的code时的连接也是不同的。

https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=url&response_type=code&scope=snsapi_base&state=STATE&connect_redirect=1#wechat_redirect

MWEB对应非微信浏览器的公众号H5支付,而微信浏览器的公众号支付的trade_type时JSAPI。 
而第一个连接是对应MWEB方式,第二个连接对应JSAPI方式。

这里我还是想吐槽下,为什么不能把红框的话加个粗什么的突出说明呢,为什么就不能再进一步解释下呢,或者将H5支付,和公众号支付分开申请。

坑3:两个不同的access_token

这个坑不是很大,不过不仔细,仍然会给我们造成很大麻烦。在微信中,存在两个不同类型的access_token,普通类型access_token,和网页授权登录access_token

不同的接口,所需要使用的token类型不同,但是很自然的是API文档并没有在每个接口出明确提醒我们应该使用什么类型的token(很好,大家给程序员呱唧呱唧!),一切看你的天资,理解很领悟。 
微信只在某个和API接口不太相关的文档页面,偷偷告诉你,有两个不同的类型,使用环境不一致。

我也没有办法给出全部的接口对应的是什么类型,毕竟我没有把微信所有接口都接一遍,不过相信通过我的文章,我相应大家至少可以看出门道,抛砖引玉。就支付流程而言,授权登录时,获得的token是后者网页授权登录access_token,需要为每个用户都获取一个不同的token值。而在使用支付相关接口时,由于支付相关的功能,是由我们(第三方平台服务器)发起的,所以微信需要对我们的后台授予一个凭证,这个是普通类型access_token。我们的服务器将向微信发起请求,并获得一个token,以保证我们的服务器可以正常访问微信API,这个token,对于我们的服务器而言,只有一个。

无论是普通类型还是网页授权类型的token,都是有时效的,超过时效,这个授权就失效了,我们需要重新请求。

到这里就先把大概的坑,和一些概念介绍下,接下来就开始从头一步步接入支付了

亲历H5移动端游戏微信支付接入及那些坑(一)——支付方式与坑的更多相关文章

  1. 亲历H5移动端游戏微信支付接入及那些坑(二)——获取Openid和授权

    第一篇中将一些坑说明,那么这篇开始正式进入接入步骤.具体的参数说明,我不会列出,毕竟微信官方文档都有,我想大家都看的懂,而且这接口也有可能微信会变动,所以不列出来,也是不想引起大家的误解,接入步骤只起 ...

  2. 亲历H5移动端游戏微信支付接入及那些坑(四)——参考文档

    写完三篇后,我觉得微信支付的文档确实比较乱,所以在此做一个整理汇总 支付流程相关文档 一下文档已经按照接入顺序排列,请依次参考阅读 微信公众号网页授权两种access_token区别,获取用户open ...

  3. 亲历H5移动端游戏微信支付接入及那些坑(三)——支付接入

    终于到接入支付了,小小的一个微信支付,居然也写了3篇,好长,好累. 接入环境 对接入环境,前端的话,应该是以js为主吧,也有可能是,PHP,Java,C++,或者C#都可以.为什么在此特意提一下接入环 ...

  4. C#开发微信门户及应用(32)--微信支付接入和API封装使用

    在微信的应用上,微信支付是一个比较有用的部分,但也是比较复杂的技术要点,在微商大行其道的年代,自己的商店没有增加微信支付好像也说不过去,微信支付旨在为广大微信用户及商户提供更优质的支付服务,微信的支付 ...

  5. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_6-2.申请微信支付介绍和不同场景的支付方式

    笔记 2.申请微信支付介绍和不同场景的支付方式         简介:介绍微信商户平台,支付方式和使用场景,申请微信支付流程                  1.什么是微信商户平台:        ...

  6. 微信支付接入的总结 —— NATIVE & MWEB & JSAPI

    这段时间工作中需要对接微信支付,而且要多个端同时进行接入,web端,手机浏览器,微信浏览器,所以研究了下.不同场景选择合适的接入方式是必须的.https://pay.weixin.qq.com/wik ...

  7. Android app 第三方微信支付接入详解

    微信支付做了好几遍了,都没有出现什么棘手的问题,下面一一为大家分享一下,欢迎吐槽. 还是老样子,接入微信的支付要第一步添加微信支付官方的包libammsdk.jar 首先就处理略坑的一个问题,app应 ...

  8. Wechat 微信端调用“微信支付接口”的正确方式

    微信端的项目中,比如微信商城之类的,肯定会涉及到微信支付这一块: 下面直接上详细的代码: var data = {--}; // 调用微信支付需要的数据 function onBridgeReady( ...

  9. 在Web应用中接入微信支付的流程之极简清晰版

    在Web应用中接入微信支付的流程之极简清晰版 背景: 在Web应用中接入微信支付,我以为只是调用几个API稍作调试即可. 没想到微信的API和官方文档里隐坑无数,致我抱着怀疑人生的心情悲愤踩遍了丫们布 ...

随机推荐

  1. Java 集合细节(二):asList 的缺陷

    在实际开发过程中我们经常使用 asList 讲数组转换为 List,这个方法使用起来非常方便,但是 asList 方法存在几个缺陷: 一.避免使用基本数据类型数组转换为列表 使用 8 个基本类型数组转 ...

  2. sklearn中SVM调参说明

    写在前面 之前只停留在理论上,没有实际沉下心去调参,实际去做了后,发现调参是个大工程(玄学).于是这篇来总结一下sklearn中svm的参数说明以及调参经验.方便以后查询和回忆. 常用核函数 1.li ...

  3. Statistical Artifact (error)

    In natural science and signal processing, an artifact is any error in the perception or representati ...

  4. [转]CENTOS LINUX安装并使用NFS共享文件

    FROM :http://www.qiansw.com/centos-linux-nfs.html NFS是linux常用的一种文件分享工具. 下面介绍安装及使用方法. CentOS 5.5 yum ...

  5. iOS:UICollectionView的扩展应用

    一.介绍 CollectionView是iOS中一个非常重要的控件,它可以实现很多的炫酷的效果,例如轮播图.瀑布流.相册浏览等.其实它和TableView很相似,都是对cell进行复用,提高系统性能. ...

  6. Lync 2013安装中遇到的关于SQL Mirroring的一次报错的解决

    Problem Description ================= Following the Lync Deployment Wizard to setup Database Mirrori ...

  7. Subset II leetcode java

    题目: Given a collection of integers that might contain duplicates, S, return all possible subsets. No ...

  8. 集合 enum 枚举 简介 案例 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. 用css3实现风车效果

    前面讲过css3可以替代很多js实现的效果,其实很多时候纯css3甚至可以替代图片,直接用css3就可以画出一些简单的图片.虽然css3画出来的图片效果可能不如直接用图片的好,实现起来也比较复杂,最麻 ...

  10. laravel 开启sql调试

    打开app\Providers\AppServiceProvider.PHP,在boot方法中添加如下内容 public function boot() { //sql调试 $sql_debug = ...