开通微信支付支付产品


首先要在微信支付申请成为 微信支付商户

选择开通具体的支付产品


成为微信支付商户后在管理后台选择微信支付中的具体支付产品并申请开通如 JSAPI

将支付商户与公众号关联


这一步是可选的,是由具体的支付产品是否需要与公众号交互决定,如本例中的JSAPI就需要公众号的支持。拥有支付功能的商户需要与某公众号关联,才能互相获取相应权限和数据,如JSAPI就需要通过关联的公众号获取用户 openid 用于识别用户。关联的方法是进入商户后台 APPID授权管理 页面,新增提交要关联某公众号申请,需要输入的 APPID 要从被关联的公众号处获得。申请提交后该公众号在 微信支付 商户号管理 待关联商户号 处进行确认授权。

点击查看官方指引

一通头疼的配置( !!-- )


管理后台配置

  • 支付授权目录

    进入商户后台 开发配置 支付配置,新增 公众号支付 的支付授权目录,该目录是商家的后台(开发)服务也就是向微信支付发起请求的服务器的程序运行目录,支持路径,但不支持自定义端口。应设置为接口所在目录并以/结尾,即如果接口完整路径为 http://domain/wxpay/jsapi.php 那该目录应该被设置为 http://domain/wxpay/ 而不应该是其它任何形式。

  • 公众号接口权限

    进入公众号后台,进入 设置 公众号设置 功能设置 网页授权域名,将网页授权域名按官方指导设置为开发服务器上允许获取微信用户 openid 的域名,也就是微信授权数据回调要访问的域名,只有先在微信这儿登了记的域名微信才会向其传输数据,相当于白名单。本例中,将目录设置为 wxpay.txxxt.com,并将该页面中微信提供的验证文件按要求放到目录下,即可正确设置。可以通过查看 开发 接口权限 网页授权获取用户基本信息 的显示结果判断是否设置完毕。

  • 用于开发调试的微信号要关注该公众号

  • 在公众号内绑定开发人员微信号

    进入该公众号的管理后台开发 开发者工具 web开发者工具 页面中,点击 绑定开发者微信号 将关注了该公众号的开发所用的微信号添加到列表中,在使用 web开发者工具 时用被绑定的微信号登录开发者工具,将可以获取到相关数据,如 openid,否则无法获取,因为公众号不认识当前调用它的人。

开发环境准备

  • Web(H5+后端接口)可以使用任何习惯的工具开发即可

  • 下载 微信web开发者工具

    在开发/调试中,涉及到微信Api调用(访问微信服务器)的,均需使用 微信web开发者工具 的公众号网页功能访问要调试的页面,不能使用普通浏览器。因为 开发者工具 具有普通浏览器没有的微信Api特性。

  • 本例中项目路径 http://wxpay.txxxt.com/jsapi/getCode.php 接口创建获取 code 的完整链接并发出请求,codeCallback.php 接口用于接收从微信发出的回调,成功将包含 code 的值,log.php 记录日志,jsapi_access_log.log 为日志文件。PHP 作为接口开发语言,使用 微信web开发者工具 公众号网页调试功能访问接口跟踪结果。

开发实践


第一步,用户同意授权,获取 code

code 是用来取得 openid 的钥匙,先访问微信指定的api取得 code,再拿 code 去换取 openid 是第一步要做的事情。

获取 code 只需按照微信给出的固定访问方式,拼接参数,请求指定接口,如无错误即可获得,详见下

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

这是微信的标准接口,我们需要处理里边几个参数

  • appid,必填,在 微信公众平台 基本配置 公众号开发信息 开发者ID(APPID) 处获取
  • redirect_uri,必填,urlencode处理,如参数无误微信接口将跳转回调此地址,并附带上结果参数,详见下方 返回值 说明
  • response_type,必填,返回类型,固定填写字符串 code
  • scope,必填,应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )
  • state,选填,开发者自定义参数,可以填写a-zA-Z0-9,最多128字节,重定向后会带上
  • #wechat_redirect,必填,无论直接打开还是做页面302重定向,必须带此参数

按微信要求,除参数名和参数值要正确填写外,顺序也不可更改,否则请求将失败,拼接完整请求并通过header方式访问见下例

//header('content-type:application:json;charset=utf8');
header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Methods:GET');
header('Content-type: text/html; charset=utf-8'); $appId = ""; // 此处填写公众号 appid
$redirectUrl = "http://wxpay.txxxt.com/jsapi/openIdRedirect.php"; //此处填写回调地址
$state = strval(time()); // 模拟自定义 state 参数
$baseUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?"; //拼接字符串得到完整接口地址,要保证参数顺序与官方接口示例一致
$requestUrl = $baseUrl;
$requestUrl = $requestUrl."appid=".$appId;
$requestUrl = $requestUrl."&redirect_uri=".urlencode($redirectUrl);
$requestUrl = $requestUrl."&response_type=code&scope=snsapi_base"; // 不调用授权页的方式
$requestUrl = $requestUrl."&state=".$state;
$requestUrl = $requestUrl."#wechat_redirect"; header("Location: $requestUrl"); //返回并直接跳转到拼接完成的接口地址去
exit();

看一个拼接好的地址样例

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxcc70xxxxxxxxxxbbf&redirect_uri=http%3A%2F%2Fwxpay.txxxt.com%2Fjsapi%2FopenIdRedirect.php&response_type=code&scope=snsapi_base&state=1561360134#wechat_redirect

返回值说明 接口访问成功的话,微信会根据 redirect_uri 回调如下

http://wxpay.txxxt.com/jsapi/openIdRedirect.php?code=081vlfXQ11LXM11TiPTQ19n7XQ1vlfXq&state=xxxxxx

接收回调的接口要有能处理 code 的能力,详见下

header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Methods:GET');
header('Content-type: text/html; charset=utf-8'); $code = isset($_GET['code']) ? $_GET['code'] : "";
$state = isset($_GET['state']) ? $_GET['state'] : ""; if($code == ""){
echo("获取失败,人家没给有效的 code");
} else {
echo("获取成功,拿到了 code");
}

处理回调的核心逻辑其实很简单,就是判断 code 的有效性,有值就对了,否则就参照官方文档的错误码检查问题原因。回顾一下刚才的过程

  • 使用web开发者工具访问 getCode.php 接口,拼接完整请求地址,获得 code

  • 访问成功微信回调

  • 回调接口记录了微信回调结果,查看日志,的确收到了 code

第二步,AppID + AppSecret + code 获取 openid

首先,通过公众号的 微信公众平台 开发 基本配置 开发者ID 开发者密码(AppSecret) IP白名单 ,获取 AppIDAppSecret 两个关键信息(APPID第一步已经获得),需要注意的是,虽然微信的官方Wiki教程中并没有提到设置IP白名单,但在设置 AppSecret 时是被提示需要一并设置的。

按开发文档要求拼接参数,请求以下链接获取access_token

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

四个参数均为必填项,其中 grant_type 的值 authorization_code 为固定值,代码示例如下

******http

第一步将获取到的 code = 011L1Tzo16tbFj0L7zAo1riQzo1L1Tzm 拼接完整

https://api.weixin.qq.com/sns/oauth2/access_token?appid=wxccxxxxxxxxxbbf&secret=2axxxxxxxxxxxxxxxxxx22&code=011L1Tzo16tbFj0L7zAo1riQzo1L1Tzm&grant_type=authorization_code


code 有效期内请求该接口获得响应结果,成功返回JSON如下

{
"access_token": "22_sAk0YqHOr8f71n0WYGs8jXkdOqgpl_b4Yag3KMStE1oTPJRHjSxdDVEH6E0Ma_WdQ6gflPB5Tkr0Rmpv0VK5Bw",
"expires_in": 7200,
"refresh_token": "22_VU66fwGFZtq9XpX9s0r0k0d5p4zKQhJ-D_QnQiIo2BMfzMOzPaiVfPfCOWBGalWZtKsevxqcmgUud9zATlc5Xg",
"openid": "oHxxxxxxxxxxxxxxxxxxmg",
"scope": "snsapi_base"
}

错误将返回

{"errcode":40029,"errmsg":"invalid code"}

至此,snsapi_base 方式获取 openid 的过程已经结束,下一篇将讲述如何使用 openid 请求预支付交易标识。

微信支付 第一篇 JSAPI 支付配置与获取 OpenID的更多相关文章

  1. #PHP#微信支付 第二篇 JSAPI 调用统一下单接口获取预支付交易数据

    上一篇讲到成功获取 openid,本篇要调用微信统一接口创建预支付交易单,并获取到相关数据,以便(后边)在微信内调起H5支付 第三步,调用微信统一下单接口创建预支付交易单 微信统一下单API是微信支付 ...

  2. php微信支付(仅Jsapi支付)详细步骤.----仅适合第一次做微信开发的程序员

    本人最近做了微信支付开发,是第一次接触.其中走了很多弯路,遇到的问题也很多.为了让和我一样的新人不再遇到类似的问题,我把我的开发步骤和问题写出来,以供参考. 开发时间是2016/8/2,所以微信支付的 ...

  3. 微信绑定用户服务端代码-根据code获取openId然后绑定用户

    目录结构: isa.qa.core.weixin.message.resp包和isa.qa.core.weixin.util包中为微信绑定的工具类,就不一一贴出代码,详见附件,下载地址: http:/ ...

  4. cocos2d-x学习记录第一篇-环境变量配置

    最近准备学习cocos2d-x,之前一直是做iOS开发的,算是零基础开始学习吧. (此条后来修改,不用配置下面这些东西,下载一个cocosstudio就可以了,直接在里边就创建工程了) 本人用Mac电 ...

  5. asp.net微信开发第一篇----开发者接入

    在项目的根目录或者特定的文件夹内,创建一个ashx文件(一般处理程序文件),如图 public void ProcessRequest(HttpContext context) { context.R ...

  6. IOS百度地图之--->第一篇《环境配置与基本使用》

    Ios 百度地图SDK简易使用说明:http://developer.baidu.com/map/index.php?title=iossdk 先道歉:对于原来上传的Demo我很抱歉,什么都没有,也没 ...

  7. 第一篇:CDH配置本地http服务

    在我们安装cdh的时候,避免不了要安装一大堆软件,包括cm的服务器,hadoop的各种组件.这些组件的文件都比较大,所以我们会在本地配置一个http服务,以便于在安装cdh服务的时候能快速的安装完.本 ...

  8. 第一篇 -- 安装和配置PyQt5

    我的电脑环境是:Win10 + Python3.6.4 + JetBrains PyCharm 2017.3.2 x64 之前用tkinter写界面,现在学习如何用PyQt5写界面. 安装PyQt5: ...

  9. [转载] 纯手打 第一篇:安装配置gradle

    本文转载自: http://www.cnblogs.com/uncle2000/p/4276833.html 一个bug 一个脚印的叫你们用gradle. 1介于网络上的很多资料都是老的 不适用与现在 ...

随机推荐

  1. Kubernetes 时代的安全软件供应链

    点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击上方图片即可下载! 作者 汤志敏  阿里云 ...

  2. 基于webpack实现多html页面开发框架四 自动写入多入口,自动插入多个htmlWebpackPlugin插件

    一.解决什么问题      1.手写页面多入口,一个一个输入太麻烦,通过代码实现      2.手写多个htmlWebpackPlugin插件太麻烦,通过代码实现 二.多入口代码实现 //读取所有.j ...

  3. Springboot整合webservice

    Springboot整合webservice 2019-12-10 16:34:42 星期二 WebService是什么 WebService是一种跨编程语言和跨操作系统平台的远程调用技术,服务之间的 ...

  4. eclipse maven 项目导出为 jar 包

    一个 maven 项目有很多依赖,所以最后打出的 jar 一般会很多,且比较大,打成 jar 包的步骤 (注意pom.xml文件中打包类型不能是war包): 1. 把 pom.xml 中依赖的库打成 ...

  5. 浏览器/外网访问docker container中的hadoop

    假设你制作了个docker的 hadoop的镜像,镜像名叫 hd_image,如果想在外网的浏览器中访问hadoop的50070和8088端口,则在启动镜像hd_image时, 脚本如下: docke ...

  6. luogu P2824 [HEOI2016/TJOI2016]排序

    题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行 ...

  7. native-base中Input,Textarea等组件在ios平台下不能输入中文

    在上文react-native中TextInput在ios平台下不能输入中文已经解决. 但是在native-base中Input和Textarea都存在这样的问题.为了不要写多个组件,封装以下代码: ...

  8. vmware虚拟机扩大硬盘

    记录一下对vmware虚拟机扩大硬盘的过程.操作有风险,重要数据请先进行备份. 1.首先在vcenter中将虚拟机下电,然后编辑虚拟机,将虚拟机硬盘扩大.具体操作见下图 2.打开虚拟机电源,利用fdi ...

  9. 小白学 Python 爬虫(19):Xpath 基操

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  10. Bootstrap响应式栅格系统设计

    为了方便起见,我们通过1200px宽的屏幕来讲解bootstrap中container.row.col的css属性值为何这样设置的原理 在1200px屏幕中为何container的宽度设置为1170p ...