关于微信的卡券功能,百度上我只能搜到的都是跟官网差不多的东西.所以就自己对着官方文档跑了一天,为了满足公司的需求鼓捣得到一些小心得.情景是我们需要一堆已知code的卡券,但是微信公众号后台可视化界面并不支持这样的模式.微信自带生成的卡券是有人触发就随机分配一个码,并不实用,因为我们并是那种消费的业务逻辑,而是更像是体验卡的形式.


1.用api建立的卡券才能使用自定义code功能,也就是譬如我想卡券用英文句子来作为卡券的码.这种时候我们就需要调用微信公众号的api了,可以使用http://mp.weixin.qq.com/debug/里的测试接口生成.也可以自己跑微信接口.

  • 敲黑板!敲黑板!敲黑板!

麻烦的地方是不这个接口怎么触发,而是这个卡券的json信息.一大串,关键的功能挺多的,我都看了一天文档才搞清楚了一些.

{
    "card_type":"GENERAL_COUPON",//这里有5个选择,具体是根据类型决定的
    "general_coupon":{
        "base_info":{/*[必填,详情看这里][1]*/},
        "default_detail":'一些描述',
        "advanced_info":{/*选填*/}
    }
}

只要json正确就能post过去就能看见创建了一个卡券了.

2.本文主要是介绍自定义code群发这个功能,所以必须声明的两个属性.下面为官方原文提示

如果开发者打算新创建一张支持导入code模式的卡券,不同于以往的创建方式,建议开发者采用以下流程创建预存code模式卡券,否则会报错。

步骤一:创建预存模式卡券,将库存quantity初始值设置为0,并填入get_custom_code_mode字段;

步骤二:待卡券通过审核后,调用导入code接口并核查code;

步骤三:调用修改库存接口,须令卡券库存小于或等于导入code的数目。(为了避免混乱建议设置为相等)

请输入图片描述

3.导入code,前期工作做好了,就可以进入最关键的阶段,一就是生成你自己需要的code,这个跟微信api无关,你想生成什么就生成.之后才是真的关键的地方,卡券code的导入一次调用只能100个,然后卡券的库存可以修改.

  • 我是一次过插入10000个的,毕竟一个卡券的最高上限是1亿个code.通过for循环100个100个那样插入,并且100个100个库存那样增加.可以在后台可视化地看见code的数目的增长.

    请输入图片描述
    总结::这样创建出来的卡券不能生成二维码入口,但是可以插入到推送中,也可以插入到服务号的菜单中.

附件:

<?php
if (isset($_GET['act'])) {
    $act = $_GET['act'];
}
if(isset($_GET['tool'])){
    $tool = $_GET['tool'];
}

if ($act == 'card_create') {
    ;
}elseif($act == 'check_code'){
    $code_arr = get_code();
    foreach ($code_arr as $key => $hundred_code) {
        card_manager('codeCheck',0,$hundred_code);
    }
}elseif($act == 'import_code') {
    $code_arr = get_code();
    foreach ($code_arr as $key => $hundred_code) {
        card_manager('codeDeposit',0,$hundred_code);
        card_manager('stockModify',100);
    }
}elseif($act == 'card_detail'){
    card_manager('cardGet');
}elseif($tool == 'shorten'){
    card_manager('long2short');
}elseif($tool == 'gcode'){
    generate_code();
}elseif($tool == 'compare'){
    compare_code_diff("cpyhq1.txt","cpyhq2.txt");
}else{
    echo "有毛病";
}


function get_card_id()
{
    $card_id = "卡券id";
    return $card_id;
}

function card_manager($event,$stockNum=0,$code_arr=[],$stock_status='increase')
{
    $access_token = 'access_token还没写获取方法';

    $longlink = "";//长链接

    switch ($event) {
        case 'codeDeposit':
            //code储存
            $url = "http://api.weixin.qq.com/card/code/deposit?access_token=".$access_token;
            $json = json_encode(array("card_id"=>get_card_id(),"code"=>$code_arr));
            break;
        case 'codeCheck':
            //code状态检查
            $url = "http://api.weixin.qq.com/card/code/checkcode?access_token=".$access_token;
            $json = json_encode(array("card_id"=>get_card_id(),"code"=>$code_arr));
            break;
        case 'stockModify':
            //库存数量修改
            $url = "https://api.weixin.qq.com/card/modifystock?access_token=".$access_token;
            if ($stock_status=='increase') {
                $str = "increase_stock_value";
            }elseif($stock_status=='reduce'){
                $str = "reduce_stock_value";
            }
            $json = '{
                        "card_id": "'.get_card_id().'",
                        "'.$str.'": '.$stockNum.'
                    }';
            break;
        case 'cardGet':
            //优惠卡详细信息
            $url = "https://api.weixin.qq.com/card/get?access_token=".$access_token;
            $json = json_encode(array("card_id"=>get_card_id()));
            break;
        case 'long2short':
            //微信短链
            $url = "https://api.weixin.qq.com/cgi-bin/shorturl?access_token=".$access_token;
            $json = json_encode(array("action"=>"long2short","long_url"=>$longlink));
            break;
        case 'cardUpdateName':
            //优惠卡基本修改修改
            $url = "https://api.weixin.qq.com/card/update?access_token=".$access_token;
            $json = '{
                       "card_id":"'.get_card_id().'",
                       "general_coupon": { 
                               "base_info": {
                                       "title":"测评优惠券1"
                               }
                       }
                }';
            break;
        case 'cardDelete':
            //优惠卡删除
            $url = "https://api.weixin.qq.com/card/delete?access_token=".$access_token;
            $json = json_encode(array("card_id"=>get_card_id()));
        default:
            # code...
            break;
    }

    $result = https_request($url, $json);
    echo $result;
}

function generate_code(){
    /*每两个数字之间重复的概率为90万*90万分之一
        基本不会重复
     */
    $arr = array();
    for ($i=0; $i < 10000; $i++) { 
        $a = rand(100000,999999);
        $b = rand(100000,999999);
        $arr[$i] = $a*$b;
        if (strlen($arr[$i])<12) {
            $fix = rand(0,9);
            $arr[$i] = (string)$arr[$i].(string)$fix;
            $arr[$i] = intval($arr[$i]);
        }
    }
    if (count($arr) != count(array_unique($arr))) {   
        generate_code();  
    } 
    $fp = fopen('output.txt','w+');
    foreach ($arr as $key => $value) {
        fwrite($fp,$value."\n");
    }
    fclose($fp);
    //return $arr;
}

function get_code(){
    $file = 'coupon.txt';
    $content = file_get_contents($file); //读取文件中的内容
    $str = str_replace(array("\r\n", "\r", "\n"), " ", $content); 
    $arr = explode(' ', $str);
    unset($arr[count($arr)-1]);
    //把过长的code段成几截
    $num = count($arr);
    $return_arr = [];
    $counter = $num%100 == 0? ($num/100)-1:floor($num/100);//分组计数器
    for ($i=0; $i <= $counter; $i++) { 
        $return_arr[$i] = array_slice($arr,$i*100,100);
    }
    return $return_arr;
}

function compare_code_diff($f1,$f2){
    $file1 = $f1;
    $file2 = $f2;
    $content = file_get_contents($file1); //读取文件中的内容
    $str1 = str_replace(array("\r\n", "\r", "\n"), " ", $content); 
    $arr1 = explode(' ', $str1);

    $content = file_get_contents($file2); //读取文件中的内容
    $str2 = str_replace(array("\r\n", "\r", "\n"), " ", $content); 
    $arr2 = explode(' ', $str2);

    print_r(array_flip(array_merge($arr1,$arr2)));
}

function https_request($url, $data = null)
{
    $curl = curl_init();
    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;
}
?>