Yii2.0实现微信公众号后台开发

广告:宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取~~~

Yii2.0实现微信公众号后台开发

本文内容较多,包括微信接入、获取微信用户信息、微信支付、JSSDK配置参数获取等部分。如果读者对微信开发没有一个主观上的认识,那么建议读者先研读 微信公众平台开发者文档 ,然后再阅读本文,效果更佳!另外本文的分章节版本可以在 八宝粥的博客 找到。

接入微信Yii2后台配置

1.在app/config/params.php中配置token参数

return [    //微信接入    'wechat' =>[        'token' => 'your token',    ],];
登录后复制

2.在app/config/main.php中配置路由

因为接口模块使用的RESTful API,所以需要定义路由规则。

'urlManager' => [    'enablePrettyUrl' => true,    'enableStrictParsing' => true,    'showScriptName' => false,    'rules' => [        [            'class' => 'yii\rest\UrlRule',            'controller' => 'wechat',            'extraPatterns' => [                'GET valid' => 'valid',            ],        ],    ],],
登录后复制

3.在app/controllers中新建WechatController

<?phpnamespace api\controllers;use Yii;use yii\rest\ActiveController;class WechatController extends ActiveController{    public $modelClass = '';    public function actionValid()    {        $echoStr = $_GET["echostr"];        $signature = $_GET["signature"];        $timestamp = $_GET["timestamp"];        $nonce = $_GET["nonce"];        //valid signature , option        if($this->checkSignature($signature,$timestamp,$nonce)){            echo $echoStr;        }    }    private function checkSignature($signature,$timestamp,$nonce)    {        // you must define TOKEN by yourself        $token = Yii::$app->params['wechat']['token'];        if (!$token) {            echo 'TOKEN is not defined!';        } else {            $tmpArr = array($token, $timestamp, $nonce);            // use SORT_STRING rule            sort($tmpArr, SORT_STRING);            $tmpStr = implode( $tmpArr );            $tmpStr = sha1( $tmpStr );            if( $tmpStr == $signature ){                return true;            }else{                return false;            }        }    }}
登录后复制微信公众号后台配置

在微信公众号后台配置URL和Token,然后提交验证即可。

URL:http://app.demo.com/wechats/validToken:your token
登录后复制获取用户信息用户表设计
CREATE TABLE `wechat_user` (  `id` int(11) NOT NULL,  `openid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,  `nickname` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT '微信昵称',  `sex` tinyint(4) NOT NULL COMMENT '性别',  `headimgurl` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '头像',  `country` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT '国家',  `province` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT '省份',  `city` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT '城市',  `access_token` varchar(255) COLLATE utf8_unicode_ci NOT NULL,  `refresh_token` varchar(255) COLLATE utf8_unicode_ci NOT NULL,  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;ALTER TABLE `wechat_user`  ADD PRIMARY KEY (`id`);
登录后复制获取用户信息的相关接口

1.用户授权接口:获取access_token、openid等;获取并保存用户资料到数据库

public function actionAccesstoken(){    $code = $_GET["code"];    $state = $_GET["state"];    $appid = Yii::$app->params['wechat']['appid'];    $appsecret = Yii::$app->params['wechat']['appsecret'];    $request_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$appsecret.'&code='.$code.'&grant_type=authorization_code';    //初始化一个curl会话    $ch = curl_init();    curl_setopt($ch, CURLOPT_URL, $request_url);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    $result = curl_exec($ch);    curl_close($ch);    $result = $this->response($result);    //获取token和openid成功,数据解析    $access_token = $result['access_token'];    $refresh_token = $result['refresh_token'];    $openid = $result['openid'];    //请求微信接口,获取用户信息    $userInfo = $this->getUserInfo($access_token,$openid);    $user_check = WechatUser::find()->where(['openid'=>$openid])->one();    if ($user_check) {        //更新用户资料    } else {        //保存用户资料    }    //前端网页的重定向    if ($openid) {        return $this->redirect($state.$openid);    } else {        return $this->redirect($state);    }}
登录后复制

2.从微信获取用户资料

public function getUserInfo($access_token,$openid){    $request_url = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN';    //初始化一个curl会话    $ch = curl_init();    curl_setopt($ch, CURLOPT_URL, $request_url);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    $result = curl_exec($ch);    curl_close($ch);    $result = $this->response($result);    return $result;}
登录后复制

3.获取用户资料接口

public function actionUserinfo(){    if(isset($_REQUEST["openid"])){        $openid = $_REQUEST["openid"];        $user = WechatUser::find()->where(['openid'=>$openid])->one();        if ($user) {            $result['error'] = 0;            $result['msg'] = '获取成功';            $result['user'] = $user;        } else {            $result['error'] = 1;            $result['msg'] = '没有该用户';        }    } else {        $result['error'] = 1;        $result['msg'] = 'openid为空';    }    return $result;}
登录后复制微信支付

1.微信支付接口:打包支付数据

public function actionPay(){    if(isset($_REQUEST["uid"])&&isset($_REQUEST["oid"])&&isset($_REQUEST["totalFee"])){        //uid、oid、totalFee        $uid = $_REQUEST["uid"];        $oid = $_REQUEST["oid"];        $totalFee = $_REQUEST["totalFee"];        $timestamp = time();        //微信支付参数        $appid = Yii::$app->params['wechat']['appid'];        $mchid = Yii::$app->params['wechat']['mchid'];        $key = Yii::$app->params['wechat']['key'];        $notifyUrl = Yii::$app->params['wechat']['notifyUrl'];        //支付打包        $wx_pay = new WechatPay($mchid, $appid, $key);        $package = $wx_pay->createJsBizPackage($uid, $totalFee, $oid, $notifyUrl, $timestamp);        $result['error'] = 0;        $result['msg'] = '支付打包成功';        $result['package'] = $package;        return $result;    }else{        $result['error'] = 1;        $result['msg'] = '请求参数错误';    }    return $result;}
登录后复制

2.接收微信发送的异步支付结果通知

public function actionNotify(){    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];    $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);    //    if ($postObj === false) {        die('parse xml error');    }    if ($postObj->return_code != 'SUCCESS') {        die($postObj->return_msg);    }    if ($postObj->result_code != 'SUCCESS') {        die($postObj->err_code);    }    //微信支付参数    $appid = Yii::$app->params['wechat']['appid'];    $mchid = Yii::$app->params['wechat']['mchid'];    $key = Yii::$app->params['wechat']['key'];    $wx_pay = new WechatPay($mchid, $appid, $key);    //验证签名    $arr = (array)$postObj;    unset($arr['sign']);    if ($wx_pay->getSign($arr, $key) != $postObj->sign) {        die("签名错误");    }    //支付处理正确-判断是否已处理过支付状态    $orders = Order::find()->where(['uid'=>$postObj->openid, 'oid'=>$postObj->out_trade_no, 'status' => 0])->all();    if(count($orders) > 0){        //更新订单状态        foreach ($orders as $order) {            //更新订单            $order['status'] = 1;            $order->update();        }        return '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';    } else {        //订单状态已更新,直接返回        return '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';    }}
登录后复制

3.微信支付类 WechatPay.php

'urlManager' => [    'enablePrettyUrl' => true,    'enableStrictParsing' => true,    'showScriptName' => false,    'rules' => [        [            'class' => 'yii\rest\UrlRule',            'controller' => 'wechat',            'extraPatterns' => [                'GET valid' => 'valid',            ],        ],    ],],0
登录后复制获取JS-SDK的config参数

根据微信公众平台开发者文档:

所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。

即:

'urlManager' => [    'enablePrettyUrl' => true,    'enableStrictParsing' => true,    'showScriptName' => false,    'rules' => [        [            'class' => 'yii\rest\UrlRule',            'controller' => 'wechat',            'extraPatterns' => [                'GET valid' => 'valid',            ],        ],    ],],1
登录后复制

1.微信支付类 WechatPay.php

'urlManager' => [    'enablePrettyUrl' => true,    'enableStrictParsing' => true,    'showScriptName' => false,    'rules' => [        [            'class' => 'yii\rest\UrlRule',            'controller' => 'wechat',            'extraPatterns' => [                'GET valid' => 'valid',            ],        ],    ],],2
登录后复制

2.获取config参数接口

'urlManager' => [    'enablePrettyUrl' => true,    'enableStrictParsing' => true,    'showScriptName' => false,    'rules' => [        [            'class' => 'yii\rest\UrlRule',            'controller' => 'wechat',            'extraPatterns' => [                'GET valid' => 'valid',            ],        ],    ],],3
登录后复制

以上就是Yii2.0实现微信公众号后台开发的详细内容,更多请关注9543建站博客其它相关文章!

9543建站博客
一个专注于网站开发、微信开发的技术类纯净博客。
作者头像
admin创始人

肥猫,知名SEO博客站长,14年SEO经验。

上一篇:微信小程序访问node.js接口服务器搭建的介绍
下一篇:bootstrap插件怎么用

发表评论

关闭广告
关闭广告