牢骚话,不用管,直接跳转关键句即可
对于腾讯的文档,我也是没什么好说的,写成这样也难为他们了,我估计他们自己的开发人员也不怎么懂。
通过科学上网,找到的资料全都是,这样第一步,中间随便搞搞,然后最后一步就可以了。
资料啥的,都是一知半解,不可操作,就没有稍微全一点的教程。
对于开发人员来说,是不是太痛苦了一些,找了半天,山穷水尽快抓狂了,最终从腾讯那边自己实现的源码找到了解决方法,找来正确答案一看,原来是酱紫。
程序员的头就是这么秃的。
对此,我只想说。
说说关键,要在微信小程序里面集成卡卷,需要经过三步,并不像微信文档所说还要激活啥的
1. 公众号和小程序绑定在《公众开放平台https://open.weixin.qq.com/》上
这个实际上是打通小程序和公众号用户系统,可以让同一个用户在两个应用中的身份标识符UnionID是一样的,小程序的用户和公众号的用户可以联系起来,从而可以在小程序应用里面发公众号的卡卷。
2. 在微信公众号后台,申请卡卷
一般的公众号是默认没有开通的,需要申请开通。
开通之后,添加一张卡卷,折扣卷,优惠卷都可以,然后添加卡卷之后,在《卡卷详情》里面,找到卡卷ID,一般是一串随机字符串,类似于这种
pX7lF1teSm1UlNvgcG3_ayBWVmtE
3. 后台根据微信公众号appid和appscreat,生成小程序领取卡卷参数。小程序端领取卡卷
后台生成代码如下,以php为例
/** * 小程序生成卡卷类 */ class GetAppCard { /** * 小程序领取卡卷,返回组装好的参数 * @param string $card_id 公众号卡卷id * @param string $ticket api请求ticket * @param string $openid 小程序用户id,不传入也没关系 * @return array */ public function buildCardParam($card_id,$ticket,$openid=""){ //获得ticket后将参数拼成字符串进行sha1加密 $timestamp = time(); $nonceStr = $this->createNonceStr(8); $arr['cardId'] = $card_id; $arr['timestamp'] = $timestamp; $arr['api_ticket'] = $ticket; $arr['nonce_str'] = $nonceStr; //组装参数 sort($arr, SORT_STRING); $sortString = ""; foreach($arr as $temp){ $sortString = $sortString.$temp; } $signature = sha1($sortString); $cardArr = [ "cardId"=>$card_id, "cardExt"=>json_encode([ 'openid' => $openid, 'timestamp' => $timestamp, 'nonce_str' => $nonceStr, 'signature' => $signature, ]) ]; return showMsg("200","参数组装完成",$cardArr); } /** *从缓存中取tiket */ public function getCacheTicket(){ $keyName ="card_wxTicket"; $ticketCacheResult = $this->getCache($keyName); if($ticketCacheResult["code"] != 200){ $tokenResult = $this->getAccessToken(); if($tokenResult["code"] != 200){ return $tokenResult; } $ticketResult = $this->getApiTicket($tokenResult["data"]); if($ticketResult["code"] == 200){ $this->addCache($keyName, $ticketResult["data"],60*10); } return $ticketResult; }else{ return $this->showMsg("200","已缓存数据",$ticketCacheResult); } } /** * 根据键值获取缓存 * @param string $cacheName 获取缓存名 * @return array */ public function getCache($cacheName) { $fileName = "./".$cacheName.".json"; $result = @file_get_contents($fileName); if (!empty($result)){ $jsonDecode = @json_decode($result,true); if(!empty($jsonDecode["expireTime"])){ $expireTime = time()-$jsonDecode["createTime"]; if($jsonDecode["expireTime"] > $expireTime){ return $this->showMsg('1','缓存已失效',$jsonDecode); } } return $this->showMsg('200','获取成功',$result); }else{ return $this->showMsg('1','获取失败,缓存不存在,检查是否拥有权限'); } } /** * 根据键值添加缓存,注意过期时间 * @param string $cacheName 获取缓存名 * @param mixed $data 获取缓存名 * @param int $expireTime 缓存失效时间 * @return array */ public function addCache($cacheName,$data,$expireTime =0 ) { $fileName = "./".$cacheName.".json"; $jsonData = [ "content" => $data, "expireTime" => $expireTime, "createTime" => time(), ]; $result = @file_put_contents($fileName,json_encode($jsonData)); if ($result){ return $this->showMsg('200','添加成功'); }else{ return $this->showMsg('1','添加失败,检查是否拥有权限'); } } /** * 获取微信访问ticket * @param string $access_token 微信的token * @return mixed */ public function getApiTicket($access_token){ $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={$access_token}&type=wx_card"; $res = $this->api_curls($url); $res = json_decode($res,true); if (!empty($res['ticket'])){ return $this->showMsg('200','获取成功',$res['ticket']); }else{ return $this->showMsg('1','获取失败',$res['ticket']); } } /** * 获取微信token * @return array */ public function getAccessToken() { $appConfig = [ "app_id"=>"123", //公众号appid "secret"=>"123", //公众号appsecret ]; $getUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $appConfig["app_id"] . "&secret=" . $appConfig["secret"]; $res = $this->api_curls($getUrl); $result = json_decode($res, true); if(empty($result["access_token"])){ return $this->showMsg(1,'获取token失败',$result); }else{ return $this->showMsg(200,'获取token成功',$result["access_token"]); } } /** * 生成随机字符串 * @param int $length * @return string */ public function createNonceStr($length = 16) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $str = ""; for ($i = 0; $i < $length; $i++) { $str.= substr($chars, mt_rand(0, strlen($chars) - 1) , 1); } return $str; } /** * 公用的方法 返回json数据,进行信息的提示 * @param int $code 状态 200=成功 1=失败 * @param string $message 提示信息 * @param mixed $data 返回数据 * @return array 格式化后的相应数组 */ public function showMsg($code=200,$message = '',$data = "") { $result = array( 'code' => $code, 'message' => $message, 'data' => $data ); return $result; } /** * 异步请求api * @param string $url 请求地址 * @param mixed $data_string post请求数据 * @param array $header 自定义header头部 * @param string $return_header * @param string $is_ssl * @param string $is_redirect * @return mixed|string */ public function api_curls($url, $data_string="",$header=array(),$return_header="no",$is_ssl="no",$is_redirect="no") { $ch = curl_init(); @curl_setopt($ch, CURLOPT_URL, $url); @curl_setopt($ch,CURLOPT_TIMEOUT,10); if (!empty($header)) { curl_setopt($ch, CURLOPT_HTTPHEADER,$header); //HEADER } if ($return_header!="no") { curl_setopt($ch, CURLOPT_HEADER, 1); } if ($is_ssl!="no") { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); } @curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if ($data_string!="") { @curl_setopt($ch, CURLOPT_POST, 1); @curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); } if ($is_redirect=="yes") { curl_setopt($ch, CURLOPT_FOLLOWLOCATION,0); } $data = @curl_exec($ch); if(@curl_errno($ch)){//出错则显示错误信息 return ""; } @curl_close($ch); return $data; } public function returnJson($data) { echo json_encode($data);die(); } } //先获取ticket $cardModel = new GetAppCard(); $ticketResult = $cardModel->getCacheTicket(); if ($ticketResult["code"] != 200) { $cardModel->returnJson($ticketResult); } //组装卡卷 $card_id = ""; $cardResult = $cardModel->buildCardParam($card_id, $ticketResult["data"]); $cardModel->returnJson($cardResult);
前台小程序调用参数如下
const app = getApp() Page({ /** * 页面的初始数据 */ data: { }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { var self =this; wx.request({ url: 'get_card_param', //仅为示例,并非真实的接口地址 data: {openid:666}, header: { 'content-type': 'application/json' // 默认值 }, success (res) { console.log("get_card_param=>", res.data.data); if (res.data.code == 200) { var cardlist = res.data.data self.addCard(cardlist); } } }) }, //添加卡卷 addCard:function(cardParam){ wx.addCard({ cardList: [cardParam], success(res) { console.log("卡卷添加成功=>",res.cardList) }, fail(res) { console.log("卡卷添加失败=>", res.cardList) }, }) }, })
4. 如有疑问,可以留下您的评论,大家一起讨论
另外,最后的福利大放送,所有源码下载
本文为原创文章,转载无需和我联系,但请注明不知道来自哪里