1、背景:
1.1 公司在开发电子发票插入微信卡包功能,涉及到用户授权成功之后,回调我们的问题,不多说了,搞起来。
2、流程步骤:
第一步:先在微信公众号里配置好回调链接:
第二步:编写好校验微信签名相关逻辑:
<?php
//微信开启服务器配置校验加密是否成功:
$signature = isset($_GET["signature"]) ? $_GET["signature"]: '';
$timestamp = isset($_GET["timestamp"]) ? $_GET["timestamp"]: '';
$nonce = isset($_GET["nonce"]) ? $_GET["nonce"]: '';
$echostr = isset($_GET["echostr"]) ? $_GET["echostr"]: '';
$token = "xxxxxxx";
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if($echostr){ //第一步先服务器验签通过
if( $tmpStr == $signature ){
echo $echostr;
}else{
echo false;
}
die;
}
//下面执行回调自己业务的代码逻辑(todo)
第三步:用户授权成功之后,收取授权完成事件推送:
微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。关于重试的消息排重,推荐使用FromUserName + CreateTime 排重。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。
返回结果
返回结果为XML格式,字段如下:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
ToUserName | String | 是 | 公众号标识 |
FromUserName | String | 是 | 用户openid |
CreateTime | Int | 是 | 事件时间 |
MsgType | String | 是 | 固定为event |
Event | String | 是 | 固定为user_authorize_invoice |
SuccOrderId | String | 否 | 授权成功的订单号,与失败订单号两者必显示其一 |
FailOrderId | String | 否 | 授权失败的订单号,与成功订单号两者必显示其一 |
AuthorizeAppId | String | 是 | 获取授权页链接的AppId |
Source | String | 是 | 授权来源,web:公众号开票,app:app开票,wxa:小程序开票,wap:h5开票 |
示例代码
<?xml version="1.0" encoding="utf-8"?>
<xml>
<ToUserName><![CDATA[gh_fc0a06a20993]]></ToUserName>
<FromUserName><![CDATA[oZI8Fj040-be6rlDohc6gkoPOQTQ]]></FromUserName>
<CreateTime>1475134700</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[user_authorize_invoice]]></Event>
<SuccOrderId><![CDATA[1202933957956]]></SuccOrderId>
<FailOrderId><![CDATA[]]></FailOrderId> < AuthorizeAppId ><![CDATA[]]></ AuthorizeAppId > <Source><![CDATA[]]></Source>
</xml>
PS: 这里按照微信的文档,获取到微信返回值并做自己的逻辑。
第四步:由于我们公司有多个环境,但是微信直接配置一个回调地址,所以需要通过一个服务器分发到其他环境:
A:先按照一定规则生成订单号:例如: dev_001,用于区分不同的订单来源以确定最后分发的环境;
B:处理出环境之后,利用curl方式进行请求;
C:回复微信,一般回复字符串 success。
代码如下:
PS:这里给自己记录下:本来想采用 header("location:xxxx")实现跳转的,结果始终都做不到,网络找了一圈,有的说是header前面不能有输出,空格等等,还有的说location与“:”之间不能有空格,花了我一整天时间,结果还是没搞掂,后面问了一个大佬,说:“只有别人跳转到你的接口上来你的接口才会跳,不是跳转过来的话话你这边也不会跳转“。
后面改成利用curl方式,果然就没问题了。
这也算是一次微信开发的经历吧,总结下来,微信文档说明很不详细,很多坑需要去趟,而且人工支持基本没有,希望这篇文章能帮帮同样趟坑的小伙伴们!