记录一次微信发票---收取授权完成事件推送(多域名分发)

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格式,字段如下:

参数类型是否必填描述
ToUserNameString公众号标识
FromUserNameString用户openid
CreateTimeInt事件时间
MsgTypeString固定为event
EventString固定为user_authorize_invoice
SuccOrderIdString授权成功的订单号,与失败订单号两者必显示其一
FailOrderIdString授权失败的订单号,与成功订单号两者必显示其一
AuthorizeAppIdString获取授权页链接的AppId
SourceString授权来源,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方式,果然就没问题了。

这也算是一次微信开发的经历吧,总结下来,微信文档说明很不详细,很多坑需要去趟,而且人工支持基本没有,希望这篇文章能帮帮同样趟坑的小伙伴们!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值