在很过微信商城业务中 公众号带参数的公众号二维码,可以实现很多业务上的功能,一个社交网站的扫码添加好友,扫码分享等等逻辑。
一般来说获取带参数的二维码的过程包括两步,首先创建二维码ticket,然后凭借ticket到指定URL换取二维码。
创建二维码ticket
每次创建二维码ticket需要提供一个开发者自行设定的参数(scene_id),分别介绍临时二维码和永久二维码的创建二维码ticket过程。
临时二维码请求说明
http请求方式: POST
URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
POST数据格式:json
POST数据例子:{"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}
或者也可以使用以下POST数据创建字符串形式的二维码参数:
{"expire_seconds": 604800, "action_name": "QR_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}
永久二维码请求说明
http请求方式: POST
URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
POST数据格式:json
POST数据例子:{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}}
或者也可以使用以下POST数据创建字符串形式的二维码参数:
{"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}
参数说明
参数 | 说明 |
---|---|
expire_seconds | 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。 |
action_name | 二维码类型,QR_SCENE为临时的整型参数值,QR_STR_SCENE为临时的字符串参数值,QR_LIMIT_SCENE为永久的整型参数值,QR_LIMIT_STR_SCENE为永久的字符串参数值 |
action_info | 二维码详细信息 |
scene_id | 场景值ID,临时二维码时为32位非0整型,永久二维码时最大值为100000(目前参数只支持1--100000) |
scene_str | 场景值ID(字符串形式的ID),字符串类型,长度限制为1到64 |
下面我用上面的例子实践一番
因为我是用thinkphp 开发的,代码也是tp风格
后端代码get_access_token 是自己定义的函数,获取access_token, http_request自己定义的函数curl请求 都是写在functions.php里面
function showqrcode(){
//获取access_token
$access_token=get_access_token($this->appid,$this->appSecret); $URL="https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=$access_token"; $data='{"expire_seconds": 604800, "action_name": "QR_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}'; $urldata=http_request($URL,$data); $ticket=json_decode($urldata,true); //获取ticket $ticket=$ticket['ticket']; $url="https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=$ticket"; // header("Location: $url"); $this->ajaxReturn($url); }
functions.php /** * 获取access_token * @param mixed $appid 公众号id * @param mixed $secret 公众号秘钥 * @return mixed $access_token */ function get_access_token($appid,$appsecret){ $appid=$appid; $appsecret=$appsecret; $url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret"; $where= array( "appid" =>$appid, "appsecret"=>$appsecret ); $info=M("access_token")->where($where)->find(); if(!$info){ $access_token=http_request($url); $data=json_decode($access_token,true); $add["access_token"]=$data["access_token"]; $add["appid"] =$appid; $add["appsecret"]=$appsecret; $add["timestamp"]=time(); M("access_token")->add($add); $access_token=$add["access_token"]; }elseif(($info["timestamp"]+7000)<time()){ $access_token=http_request($url); $data=json_decode($access_token,true); $save["access_token"]=$data["access_token"]; $save["timestamp"]=time(); M("access_token")->where($where)->save($save); $access_token=$save["access_token"]; }else{ $access_token=$info["access_token"]; } return $access_token; } /** * 获取和设置配置参数 支持批量定义 * @param $url 请求url * @param $data 发送数据 * @param $header 协议头 * @return $output 资源 */ function http_request($url,$data = null,$headers=array()) { $curl =curl_init(); if( count($headers) >= 1 ){ curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); } curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); if (!empty($data)){ curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($curl); curl_close($curl); return $output; }
//前端代码
//当一点击“生成二维码的时候,就会生成”
function showqrcode (){ $.ajax({ url:"{:U('Index/showqrcode')}", data:{}, dataType:"JSON", type:"TYPE", success:function(res){ $("#img2").attr("src",res); $(".qrcode").css("display","block"); } }) }
效果图: