微信小程序領取卡券


微信小程序領取卡券

標簽(空格分隔): php


開發前需要准備的工作

1 小程序和公眾號要有綁定
2 小程序和該公眾號要綁定到同一個開發平台下 [https://open.weixin.qq.com/]
3 公眾號開通微信卡券功能
4 卡券是在公眾號上生成的
5 小程序領取公眾號上的卡券

看官方文檔

公眾號平台卡券文檔[https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432]

小程序卡券文檔[https://developers.weixin.qq.com/miniprogram/dev/api/card.html]

簡單說一下創建卡券:
    我使用的是[創建會議門票]
    接口:http請求方式: POSTURL:https://api.weixin.qq.com/card/create?access_token=ACCESS_TOKEN
    
    參數:
    1 access_token		調用接口憑證
    2 POST數據		    JSON數據
    
    POST數據格式:
    1 card_type		string(24)	    會議門票類型。
    2 base_info		JSON結構		基本的卡券數據,見下表,所有卡券通用。
    3 meeting_detail    string(3072)	本次會議於2015年5月10號在廣州舉行,會場地點:xxxx。	會議詳情。
    主要就是填充base_info信息自己看文檔就明白了 
    
    返回值:
    {
       "errcode":0,
       "errmsg":"ok",
       "card_id":"p1Pj9jr90_SQRaVqYI239Ka1erkI"
    }
    **記得把card_id保存**

小程序領取卡券:

    前端發起請求:wx.addCard(OBJECT)
    后端把需要的參數給前端
    
    參數:
        cardList: [
            {
              cardId: '',
              cardExt: '{"code": "", "openid": "", "timestamp": "", "signature":""}'
            }, {
              cardId: '',
              cardExt: '{"code": "", "openid": "", "timestamp": "", "signature":""}'
            }
        ]
    cardId : 生成卡券返回的cardId
    cardExt : json字符串
    code : 每一張卡券都有一個code[創建時自己生成的code,這個code有特殊符號限制,和長度限制,自己去感受下微信的坑]
    openid : 用戶的openid
    timestamp : 時間戳/秒
    signature : 簽名
    
    回調:
        處理你領取成功的業務邏輯

示例代碼

小程序領取卡券:

    # 領取卡券
    public function receiveCard()
    {
        # 小程序appid
        $appId = input('appid'); 
        # openid
        $openId = input('openid); 
        # 訂單id
        $orderId = input('order_id');
        
        $list = $this->getInfo($appId, $openId, $orderId);
        
        # 返回前端json數據格式
        return $list;
    }
    
    
    public function getInfo($appId, $openId, $orderId)
    {
        # 業務處理[比如:是否開啟卡券功能 | 是否綁定了公眾號 等等等.....]
        if () xxxxxxxxx;
        
        # 查詢訂單獲取保存的 cardId 和 每張卡券的唯一標識 code
        $orderInfo = Db::table('')->field('code, card_id')->where()->select();
        
        # 獲取ApiTicket 主要用於生成簽名
        1 [簽名文檔] : [https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115] 
        
        2 [獲取access_token] : [https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$config['appid']."&secret=".$config['secret'];]
        
        3 [獲取api_ticket] : [https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=wx_card]
        
        注意:appid 和 secret 是公眾號的,通過小程序的appid查詢對應公眾號的配置。apiTicket 和 accessToken 應該緩存或者是個公共的方法,避免多個地方使用失效。
        
        # 處理數據返回數據
        foreach ($orderInfo as $key => $value) {
        
            # 生成簽名的參數
            # nonce_str 自己生成的隨機字符串31位 
            $params = [
                'code'       => $value['code'],
                'api_ticket' => $apiTicket,
                'timestamp'  => time(),
                'nonce_str'  => sp_random_string(31),
                'card_id'    => $value['card_id'],
                'openid'     => $openId
            ];
            $signature = $this->getSignature($params);
            $value['openid'] = $params['openid'];
            $value['timestamp'] = $params['timestamp'];
            $value['signature'] = $signature;
            $data[] = $value;
        }
    }
    
    # 生成簽名
    public function getSignature($params)
    {
         sort($params, SORT_STRING);
         return sha1(implode($params));
    }
    
    # 回調 
    public function cardCallBack()
    {
        # $_POST 和 input('post.')  竟然接收不到數據 沒辦法只能用 $GLOBALS['HTTP_RAW_POST_DATA']
        $postData = $GLOBALS['HTTP_RAW_POST_DATA'];
        $postData = json_decode($postData, true);
        $cardList = $postData['card_list'];
        
        # 把數據轉數組
        foreach ($cardList as $k => $v) {
            $v['cardExt'] = json_decode($v['cardExt'], true);
            $data[] = $v;
        }
        foreach ($data as $key => $value) {
            # 業務處理 
        }
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM