匿名通过本文主要向大家介绍了Yii2.0,微信公众号等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
本文内容较多,包括微信接入、获取微信用户信息、微信支付、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
<?php
namespace 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/valid Token: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 ($

