手机版

使用php微信开发的带参数的二维码

时间:2021-09-08 来源:互联网 编辑:宝哥软件园 浏览:

最近在微信PC网页上做了微信相关功能的开发。从新手的角度来看,微信微信官方账号的文档还是很难理解的。网上找到的帖子,大部分基本都是抄袭微信公众平台给出的文件。带参数的微信二维码开发过程中还有很多坑。在这里,我将详细记录我的发展历程,希望对大家有所帮助。

我在这次开发中使用了认证服务号。

1访问首先进入微信微信官方账号-基本配置下面是基本配置页面,在URL中填写服务器地址,这个地址是一个接受微信推送事件的接口,我是一个使用thinkPHP框架开发的程序,并在其中一个Module(装饰)的Action目录下新建一个类。比如:WechatAction.class.php,在这个Action中创建新的公共方法,比如:URLRedirect(),那么填写这个URL就是http://[IP]:[端口/索引. PHP/装饰/微信/urlredirect。然后填写Token,可以随意填写,不管要不要编码,然后点击OK。微信会给这个URL发送一个get请求,里面包含了很多参数,大部分都是给我们检查这个访问是否是微信服务器请求的。我自己也没有验证过。他的要求是,如果我们检查成功,也就是说用echo代替return或者ajaxReturn,用thinkPHP开发的话直接用echo I('echostr ')。动手吧。然后接口验证成功。

2带参数二维码的功能微信有两种带参数的二维码,一种是临时二维码,一种是永久二维码,但永久二维码的数量有限。这次我想实现的功能是不用登录就可以在网站上使用产品,比如获取某个产品的详细报价,但是我不想注册,但是我想保存这个报价。此时,网页可以生成二维码。只要用户用微信扫描二维码,官方微信官方账号就会给用户发送一天的图文消息。点击图文消息后,用户刚刚获得的报价可以随时点击查看,并分享给朋友对比。因此,临时二维码可以正常使用。以上是我如何使用的,下面介绍整个交互过程:

当用户扫描这个二维码时,如果关注微信官方账号,用户会直接进入带有微信官方账号的对话页面,微信服务器会在上一步设置的服务器URL中向我们推送消息,可以携带自定义参数。如果用户不关注微信官方账号,会先跳转到微信官方账号中的关注页面,点击关注后,直接进入微信官方账号中的对话页面。这时微信服务器也会向我们设置的URL推送一条事件消息,携带我们自定义的参数,我们可以根据这个参数和事件类型来控制下一步的动作。

3具体开发流程

3.1获取access_token该access_token是我们程序调用微信界面的凭证,目前有效期为7200秒,需要定期更新access_token。获取方式:方法:geturl:https://api.weixin.qq.com/cgi-bin/token? Grant _ type=client _ credential appid=APPID secret=APPSECRET,其中参数APPID和APPSECRET是我们微信官方账号的APPID和APPSECRET。在微信微信官方账号的基本配置中可以发现,通话成功会返回以下JSON数据:{ ' access _ token ' : ' access _ token ',' expires _ in' :7200

其中access_token是调用接口证书,expire_in是令牌的有效时间。我将access_token存储在数据库中,同时保存过期时间,然后封装公共函数get微信dataccesstoken(),每次先检查access_token是否过期,如果过期了,再重新获取,否则可以直接使用存储在数据库中的access_token。我忘了在哪里加的。应该限制每天获取此access_token的次数。以下是getWechatAccessToken()的具体实现:

//获取access _令牌函数微信ataccesstoken(){ $微信平台信息=M('微信_ info’)-select();$微信信息=array _ reduce($微信信息,create _ function($ result,$v ',' $ result[$ v[' conf _ name ']]=$ v;返回$ result ');$ expireTime=$微信信息[' PUBLIC _微信_ ACCESSTOCKEN _ EXPIRETIES '][' conf _ value '];//前面不用管,是我数据库相应设置if(time()$ expireTime){//access _ token未过期返回$微信信息[' PUBLIC _微信_ ACCESSTOCKEN '][' conf _ value '];}else{ //access_token过期,重新获取$baseUrl=C('微信_公共_ GET _ ACCESS _ TOKEN’);$url=str_replace('##APPSECRET# ',$微信信息[' PUBLIC _微信_APPSECRET']['conf_value'],str _ replace(# # APPID # # ',$微信信息[' PUBLIC _微信_APPID']['conf_value'],$ base URL));$ result=file _ get _ contents($ URL);$result=json_decode($result,true);if (array_key_exists('errorcode ',$result)){ //失败重试一次返回false}else{ M('微信_ info ')-其中(数组(' conf _ name '=' PUBLIC _微信_ ACCESSTOCKEN ')-保存(数组(' conf _ value '=$ result[' ACCESS _ TOKEN ']);' m('微信_ info’)-其中(数组(' conf _ name '=' PUBLIC _微信_ ACCESSTOCKEN _ EXPILES’)-保存(数组(' conf _ value '=time()$ result[' EXPILES _ in ']-200));返回$ result[' access _ token '];} }}C('微信_公共_获取_访问_令牌)=https://api.weixin.qq.com/cgi-bin/token?grant _ type=client _ credential appid=appid secret=APPSECRET

封装好这个之后,我们每次就可以安心的使用了。

.2 创建临时二维码

3.2.1 获取ticket3

请求方式:开机自检接口:https://api.weixin.qq.com/cgi-bin/qrcode/create?access _ token=TOKENPOST数据:{'expire_seconds': 604800,' action_name': 'QR_SCENE ',' action _ info ' : { ' SCENE ' : { ' SCENE _ id ' : 123 } } }接口统一资源定位器中的代币即我们在3.1中获取的访问令牌,发布数据中过期时间_秒是二维码的有效时间,最多为30天,操作名称临时二维码的话固定就是QR_SCENE,scene_id即我们自定义参数,是个32位非0整数,我在应用中把它设为订单的身份证,微信服务器推送事件的时候会把这个值返回给我们设置的接口中,然后我会根据这个值去拿相应的订单数据展示在网页上,这是后话。

下面是封装的生成临时二维码的方法:

//创建临时二维码函数gettemporaryqr code($ orderId){ $ access token=get微信ataccesstoken();$ URL=str _ replace(# # TOKEN # # ',$accessToken,C('微信_公共_ GET _暂存_ TICKE’);$二维码=' { ' expire _ seconds ' : 1800,' action_name': 'QR_SCENE ',' action _ info ' : { ' SCENE ' : { ' SCENE _ id ' : ' .$orderId .'}}}';$ result=API _ notice _ increment($ URL,$ QR码);$result=json_decode($result,true);返回URL解码($ result[' URL ']);}其中的方法api_notice_increment()是我封装的一个邮政方法函数,我试过很多邮政的方法,可能由于微信接口对邮政方法和参数的限制比较严格,这个浪费了好久时间,最后在网上找到了一个可以使用的封装好的邮政方法,建议大家先自己试试,如果微信返回错误吗,就用这个吧,起码我测试微信这个接口的时候用邮递员测试返回的都是错误,而且一定要用JSON字符串,一定要是非常严格的JSON字符串。下面是这个方法:

函数api_notice_increment($url,$ data){ $ ch=curl _ init();$ header=' Accept-charset : utf-8 ';curl_setopt($ch,CURLOPT_URL,$ URL);curl_setopt($ch,CURLOPT_CUSTOMREQUEST,' POST ');curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);curl_setopt($ch,CURLOPT_HTTPHEADER,$ header);curl_setopt($ch,CURLOPT_USERAGENT,' Mozilla/5.0(兼容;MSIE 5.01windows NT 5.0)');curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);curl_setopt($ch,CURLOPT _ AUTOREFERER,1);curl_setopt($ch,CURLOPT_POSTFIELDS,$ data);curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);$ TMPinfo=curl _ exec($ ch);if(curl _ errno($ ch)){ curl _ close($ ch);返回$ ch} else { curl _ close($ ch);返回$ tmpInfo}}getTemporaryQrcode()在配置文件中有一个参数大家可以看到,其实就是微信界面链接:c('微信_ public _ get _ temporary _ ticket ')=https://api.weixin.qq.com/cgi-bin/qrcode/create? access _ TOKEN=# # TOKEN # ##

此接口的返回值为:{ ' ticket ' : ' gqh 47 joaaaaaaasxodhrwoi 8vd 2 vpeglulnxlmnvbs 9 xl2taz 2z 3 vrntnzjjv1 brb3zhymjjaiez 23 suw mem m3 suw=',' expire _ seconds' :60,' URL ' : ' http : \/\/weixin . QQ.com \/q \/kzgfwmtm72 wpkova

其中票是我们下一步调用的凭证,expire_seconds是二维码的有效期,url是扫描生成的二维码后打开的链接。所以如果我们自己实现生成二维码的方法,就不需要调用下一步了,我就停在这一步,直接返回url值,然后用这个url值生成二维码保存在本地。PHP二维码可以用来生成二维码,使用方便。下一步也大致提到了:

3.2.2获取二维码地址的请求方式:GET界面:https://mp.weixin.qq.com/cgi-bin/showqrcode?票券=TICKET该界面的返回值为图片,可以显示也可以直接下载。我们专门用过,所以不知道怎么展示。

3.3用户扫描二维码后会发生什么3.3.1扫描后会发生什么如上所述,用户在扫描我们生成的临时二维码时,如果不关注微信官方账号,会先跳转到微信官方账号中的关注页面,点击关注后会进入微信官方账号中的对话页面,将一个事件推送到我们设置的界面。如果用户已经关注,用户微信会直接跳转到微信官方账号会话页面,然后微信服务器会向我们设置的界面推送一个事件。

用户是否关注微信服务器推送的事件,除了新用户推送的事件会在scene_id前面加一个前缀外,其他都差不多。以下是微信公众平台文档的描述:

当用户不关注时,关注后的事件被推送

xmlToUserName![CData[touser]]/touusername//开发者微信号来自username![CData[Fromuser]]/Fromusername//发件人账号(OpenID)create time 123456789/create time//邮件创建时间(整数)MsgType![CData[事件]]/MsgType//消息类型eventEvent![CDATA[订阅/事件//事件类型(订阅)EventKey![CDATA[qrscene_ 123123]]/event key//事件键值,以QR scene _为前缀,后跟二维码参数值Ticket![CDATA[TICKET]]/Ticket //二维码TICKET值,可在/xml用户关注时用于换取二维码图片/事件推送

xmlToUserName![CData[touser]]/touusername//开发者微信号来自username![CData[Fromuser]]/Fromusername//发件人账号(OpenID)create time 123456789/create time//邮件创建时间MsgType![CData[事件]]/MsgType //消息类型eventEvent![CDATA[SCAN]]/Event //事件类型EventKey![CDATA[scene _ value]]/event key//event key值为32位无符号整数,即创建二维码时的二维码scene_idTicket![CDATA[TICKET]/TICKET//二维码的票证可以用来换取二维码图片/xml3.3.2我们该怎么办

我们需要在自己填写的统一资源定位器接口中接收这个事件,然后拿到我们需要的东西做我们想干的事儿。因为我要实现的功能比较简单,只需要拿到场景编号即可,因为这是我要展示给用户看的订单数据。下面是我写的接收和处理部分,比较简单,主要看一下应该怎么接收微信推送的事件:

公共函数URL重定向(){ $ PostStr=$ GLOBALS[' HTTP _ RAW _ POST _ DATA '];$ PostObj=simple XML _ load _ string($ PostStr,' SimpleXMLElement ',LIBXML _ NocDATa);$fromUsername=(字符串)$ PostObj-from用户名;$EventKey=trim((字符串)$ PostObj-EventKey);$keyArray=explode('_ ',$ EventKey);if(count($ KeyArray)=1){//已关注者扫描$ this-sendmail($来自username,$ event key);}else{ //未关注者关注后推送事件$ this-发送消息($来自username,$ KeyArray[1]);} }我没有使用其他参数,只是根据不同的推送事件拿到我想要的订单身份证,然后这时候其实相当于你在这里用公众号的客服在跟扫码的这个用户对话,上段代码中调用的发送消息()是使用客户账号给扫码用户发送一个图文消息,因为我在拿场景_id的同时也拿到了用户的openid,可以利用这个给用户发送消息。

下面是发送消息()方法:

//给用户发送图文消息,点击跳转到报价页面公共函数sendMessage($openid,$ orderId){ $ URL=str _ replace(# # TOKEN # # '),get微信atAccessToken(),C('微信_ SEND _ MEssage’);$ RedirectURl=str _ replace(' # # ORDEID # ',$ orderId,str_replace('##OPENID# ',$openid,C('微信_ REDIRECT _ URL _ PRE’));$订单信息=M('订单')-其中(数组(“订单id”=$订单id))-字段(数组(“totalMoney”、“savedMoney”、“房间面积”)-find();$ description=str _ replace(# #房间面积# # ',int val($ order info['房间面积']* 1.25),C('微信_消息_简报');$ description=str _ replace(#总预算# # ',$orderInfo['totalMoney'],$ description);$ description=str _ replace(# MAKERBUCE # # ',$ OrderInfo[' TotalMoney ']$ OrderInfo[' SavedMoney '],$ description);$ description=str _ replace(# SAVEMONEY # # ',$orderInfo['savedMoney'],$ description);$dataStr='{'touser': ' ' .$openid .' msgtype':'news ',' news ' : { ' articles ' : [{ ' title ' : ' ' .(' c '微信_消息_标题')。'描述' : ' '。$描述.网址为“:”.$redirectUrl .picurl': ' ' .(' c '微信_消息_PICURL '),' ' ' }]} ';api_notice_increment($url,$ DataStr);}其中(' c '微信_发送_消息)='https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=##TOKEN## '至于下面的一大段字符串替换,就是在组给用户发送的文字而已,需要注意$dataStr的格式,这里面要求JSON字符串比较严格,必须所有的字符串都用双引号括起来。微信接口对邮政参数的限制真心严格。

下面是微信公众平台开发者文档中要求发送图文消息的开机自检数据格式:

{ 'touser':'OPENID ',' msgtype':'news ',' news ' : { ' articles ' :[{ ' title ' : ' Happy Day ',' description': '真是个快乐的日子',' url':'URL ',' PIC rl ' : ' PIC _ URL ' },{ ' title ' 3: ' Happy Day ',' description ' 3: '真是个快乐的日子',' URL ' 3:这时候我设置了自己网站的一个地址,这是一个get请求地址,里面携带的参数是用户的openid和订单id,这样用户点击图形消息就可以看到自己刚刚放了什么。因为需要在网页上显示用户的微信头像和昵称,所以我在参数中放了openid。这个过程:用户不登录下单-生成微信二维码-用户扫码关注微信官方账号-查看订单详情。而且因为打开这个图文消息后链接所携带的参数是用户的openid和它所下的订单id,所以无论分享到哪里,任何浏览器都可以访问,用户的头像和昵称的信息也显示出来,这也是我想要达到的效果。

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

版权声明:使用php微信开发的带参数的二维码是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。