公众号消息推送,下单成功推送示例,或许只有我本人能看懂……发出来给大家瞅瞅,说不定能立马焕然大悟……

1、管理员先关注公众号,2、扫码授权公众号门店授权码,3、在公众号推送列表开启此管理员,开启后用户付款此管理员可以收到通知

《1》通过门店去推送消息。

《2》获取该用户的公众号openid。

大概是以下图片的模样。

 

 

 

公众号openid列表。

 

某个用户的公众号openid;

需要一个公众号模板;

 

 

 

 

$data = [
                    "touser" => '某个用户的公众号openid;',
                    "template_id" => '需要一个公众号模板;',
                    "data" => [
                        "first" => [
                            "value" => '门店名称',
                            "color" => "#173177"
                        ],
                        "keyword1" => [
                            "value" => '商品名称',
                            "color" => "#173177"
                        ],
                        "keyword2" => [
                            "value" => '订单号',
                            "color" => "#173177"
                        ],
                        "keyword3" => [
                            "value" => '下单金额',
                            "color" => "#173177"
                        ],
                        "remark" => [
                            "value" => '这里是备注,通常随便你放什么文字',
                            "color" => "#173177"
                        ],
                    ],
                ];
                $get_all_access_token = $this->get_all_access_token();
                $json_data = json_encode($data); //转化成json数组让微信可以接收
                $url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" . $get_all_access_token;
                $this->curl_post($url, urldecode($json_data)); //请求开始
$get_all_access_token; 这个是公众号的token;


    /**
     * 发起POST请求
     * @param string $url 请求地址
     * @param string $data 请求参数
     * @param string string $cookiePth
     */
    function curl_post($url, $data = [], $cookiePath = '')
    {
        $ch = curl_init(); // 初始化
        curl_setopt($ch, CURLOPT_URL, $url); // 抓取指定网页
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 要求结果为字符串且输出到屏幕上
        curl_setopt($ch, CURLOPT_POST, 1); // POST提交方式
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // 请求参数
        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiePath); // 连接结束后保存cookie信息的文件
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiePath); // 包含cookie信息的文件
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 禁用后cURL将终止从服务端进行验证
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 检查服务器SSL证书中是否存在一个公用名
        $res = curl_exec($ch); // 执行一个cURL会话
        curl_close($ch); // 关闭一个cURL会话
        return $res;
    }
//放在同一个页面调用这个函数,请求微信api的post方法

 

 

//接下来我在说说什么获取公众号的token,这段代码就是获取微信那边公众号的token


$appId = $config['appid'];
        $appSecret = $config['secret'];
        $res = file_get_contents("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $appId . "&secret=" . $appSecret);
        $resdata = json_decode($res, true);

 

(1)获取公众号token成功就是下面这样,7200代表7200之后才过期,建议大家用一个函数,7200过期之后在调用token,没过期就继续用之前的。【不知道你们能不能看懂我说的话,比较乱……】

(2)将这个token存起来,存到数据库,同时将当前时间也存进去。

(3)然后在进行,将token取出来,对比存进去的时间和现在的时间,是否超过7200。

//就像这个代码

/**
     * 7200
     */
    public function user_access_token()
    {
        $user_access_token_time = $reg['user_access_token_time'];//这是数据库存的token时间
        if ($user_access_token_time + 7000 < time()) {
            //如果上次更新时间+7200小于当前时间说明该令牌已经过期
            $token = $this->user_access_token_();//说明过期,那就调用在获取一个token,再存到数据库。这里我就省略了一个存到数据库的步骤。
            if (!empty($token)) {
                $result = json_decode($token, true);
                if (!empty($result['user_access_token'])) {
                    if (!empty($result['user_access_token'])) {
                        return $result['user_access_token'];
                    }
                }
            }
        } else {
            //如果没过期,那就用之前的token
            $user_access_token = $reg['user_access_token'];
            return $user_access_token;
        }
    }

 

这就是公众号token成功的样子。

 

//这段代码,是获取公众号openid
class 类名 extends \app\api\controller\Base
{

     /* @catalog app\api\controller\user
     * @title 获取公众号openid,写入数据
     * @method POST 
     * @url https://zxzhdc.zx-xcx.com/api/user/open
     * @description: 
     * @param 必选 store_id 门店ID
     * @param 必选 code 公众号code
     * @return {"code"=>"200","message" = >"成功" ,"data":[]} 
     */
    public function open(Request $request)
    {
        $code = $request->param('code');//这个是公众号的code
        $store_id = $request->param('store_id');
        if (empty($code) || empty($store_id)) {
            return jsonr('400', '不可为空');
        }
        $store = Db::name("store")->where(['id' => $store_id])->find();
        if (empty($store)) {
            return jsonr('400',  $store_id . '不存在该门店', '');
        }
        $admin = db('admin')->where(['id'=>$store['admin_id']])->find();
        $super_id = !empty($admin['super_id']) ?$admin['super_id']: '';
        //获取access_token和openid
        $data = $this->getOpenids($code,$super_id);
        if ($data) {
            //获取用户详细信息,通过token获取详细信息,信息会有许多,等下我将截图放在后面。
            $info = $this->userinfo($data['access_token'], $data['openid']);
            if ($info) {
                $res = Db::name("public")->where(['openid' => $info['openid']])->find();
                $arr['nickname'] = base64_encode($info['nickname']);
                $arr['sex'] = $info['sex'];
                $arr['headimgurl'] = $info['headimgurl'];
                $arr['unionid'] = $info['unionid'];
                $arr['country'] = $info['country'] . ',' . $info['province'] . ',' . $info['city'];
                $arr['store_id'] = $store_id;
                $arr['admin_id'] = $store['admin_id'];
                if (!empty($res)) {
                    $arr['updatetime'] = time();
                    Db::startTrans();
                    try {
                        db('public')->where(['openid' => $info['openid']])->update($arr);//将关注公众号,然后授权公众号用户的openid存起来,也就有了前面的,公众号openid。
                        Db::commit();
                        return jsonr('200', 'success', '');
                    } catch (Exception $e) {
                        Db::rollback();
                        return jsonr('400', '绑定失败', '');
                    }
                } else {

                    $arr['openid'] = $info['openid'];
                    $arr['createtime'] = time();
                    $in = Db::name('public')->insert($arr);//将关注公众号,然后授权公众号用户的openid存起来,也就有了前面的,公众号openid。
                    // dump($arr,$in);exit;
                    if ($in) {
                        return jsonr('200', 'success', '');
                    } else {
                        return jsonr('400', '绑定失败', '');
                    }
                }
            } else {
                return jsonr('400', '获取openid失败');
            }
        } else {
            return jsonr('400', '获取openid失败');
        }
    }


    //获取微信公众号opid
    public function getOpenids($code,$super_id)
    {
        if($super_id){
            $config = db('weixin_config')->where('super_id', $super_id)->find();   
        }else{
            $config = db('weixin_config')->where('super_id', $this->super_id)->find(); 
        }
        $appId = $config['appid'];
        $appSecret = $config['secret'];
        // 获取openid
        $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appId&secret=$appSecret&code={$code}&grant_type=authorization_code";
        $data = json_decode(file_get_contents($url), true);
        if (array_key_exists('openid', $data)) {
            return $data;
        }
        return false;
    }


    public function userinfo($access_token, $openid)
    {
        //获取用户信息地址
        $urlid = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $access_token . '&openid=' . $openid . '&lang=zh_CN';
        $curl = curl_init(); // 启动一个CURL会话
        curl_setopt($curl, CURLOPT_URL, $urlid);
        curl_setopt($curl, CURLOPT_HEADER, 0);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查

        //curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true); // 从证书中检查SSL加密算法是否存在
        $tmpInfo = curl_exec($curl); //返回api的json对象

        //关闭URL请求
        curl_close($curl);
        $userinfo = json_decode($tmpInfo, true);
        return $userinfo;
    }

}

这里就是获取公众号openid的基本信息了,有些我没存,这些基本上就是常用的。

 

 

 

 

 

  

 

posted @ 2022-03-22 15:57  辛蕾亓  阅读(1037)  评论(0编辑  收藏  举报