微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

完美利用Yii2微信后台开发的系列总结

网上有很多关于YII2.0微信开发教程,但是太过复杂凌乱,所以今天在这里给大家整理总结利用Yii2微信后台开发的系列了,给需要的小伙伴们参考。

一:接入微信

Yii2后台配置

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

[ 'token' => 'your token',],];

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

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

[ 'enablePrettyUrl' => true,'enableStrictParsing' => true,'showScriptName' => false,'rules' => [ [ 'class' => 'yii\rest\UrlRule','controller' => 'wechat','extraPatterns' => [ 'GET valid' => 'valid',

3.在app/controllers中新建WechatController

rush: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,$nonce)
{
// you must define TOKEN by yourself
$token = Yii::$app->params['wechat']['token'];
if (!$token) {
echo 'TOKEN is not defined!';
} else {
$tmpArr = array($token,$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,然后提交验证即可。

rush:PHP;"> URL:http://app.demo.com/wechats/valid Token:your token

二:获取用户信息

用户表设计

代码如下:
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等;获取并保存用户资料到数据库

代码如下:
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.从微信获取用户资料

代码如下:
response($result); return $result; }

3.获取用户资料接口

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.微信支付接口:打包支付数据

代码如下:
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.接收微信发送的异步支付结果通知

代码如下:
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,$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 ''; } else { //订单状态已更新,直接返回 return ''; } }

3.微信支付类 WechatPay.PHP

代码如下:
mchid = $mchid; $this->appid = $appid; $this->key = $key; } public function createJsBizPackage($openid,$outTradeNo,$orderName,$timestamp){ $config = array( 'mch_id' => $this->mchid, 'appid' => $this->appid, 'key' => $this->key, ); $unified = array( 'appid' => $config['appid'], 'attach' => '支付', 'body' => $orderName, 'mch_id' => $config['mch_id'], 'nonce_str' => self::createNoncestr(), 'notify_url' => $notifyUrl, 'openid' => $openid, 'out_Trade_no' => $outTradeNo, 'spbill_create_ip' => '127.0.0.1', 'total_fee' => intval($totalFee * 100), 'Trade_type' => 'JSAPI', ); $unified['sign'] = self::getSign($unified,$config['key']); $responseXml = self::curlPost('https://api.mch.weixin.qq.com/pay/unifiedorder',self::arrayToXml($unified)); $unifiedOrder = simplexml_load_string($responseXml,LIBXML_NOCDATA); if ($unifiedOrder === false) { die('parse xml error'); } if ($unifiedOrder->return_code != 'SUCCESS') { die($unifiedOrder->return_msg); } if ($unifiedOrder->result_code != 'SUCCESS') { die($unifiedOrder->err_code); } $arr = array( "appId" => $config['appid'], "timeStamp" => $timestamp, "nonceStr" => self::createNoncestr(), "package" => "prepay_id=" . $unifiedOrder->prepay_id, "signType" => 'MD5', ); $arr['paySign'] = self::getSign($arr,$config['key']); return $arr; } public static function curlGet($url = '',$options = array()){ $ch = curl_init($url); curl_setopt($ch,1); curl_setopt($ch,CURLOPT_TIMEOUT,30); if (!empty($options)) { curl_setopt_array($ch,$options); } //https请求 不验证证书和host curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false); $data = curl_exec($ch); curl_close($ch); return $data; } public static function curlPost($url = '',$postData = '',$options = array()){ if (is_array($postData)) { $postData = http_build_query($postData); } $ch = curl_init(); curl_setopt($ch,$url); curl_setopt($ch,CURLOPT_POST,CURLOPT_POSTFIELDS,$postData); curl_setopt($ch,30); //设置cURL允许执行的最长秒数 if (!empty($options)) { curl_setopt_array($ch,false); $data = curl_exec($ch); curl_close($ch); return $data; } public static function createNonceStr($length = 16){ $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMnopQRSTUVWXYZ0123456789'; $str = ''; for ($i = 0; $i<$length; $i++){ $str .= substr($chars,mt_rand(0,strlen($chars) - 1),1); } return $str; } public static function arrayToXml($arr){ $xml = ""; foreach ($arr as $key => $val){ if (is_numeric($val)) { $xml .= "<" . $key . ">" . $val . ""; return $xml; } public static function getSign($params,$key){ ksort($params,SORT_STRING); $unSignParaString = self::formatQueryParaMap($params,false); $signStr = strtoupper(md5($unSignParaString . "&key=" . $key)); return $signStr; } protected static function formatQueryParaMap($paraMap,$urlEncode = false){ $buff = ""; ksort($paraMap); foreach ($paraMap as $k => $v){ if (null != $v && "null" != $v) { if ($urlEncode) { $v = urlencode($v); } $buff .= $k . "=" . $v . "&"; } } $reqPar = ''; if (strlen($buff)>0) { $reqPar = substr($buff,strlen($buff) - 1); } return $reqPar; } }

四:获取JS-SDK的config参数

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

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

即:

代码如下:
fig({ debug: true,// 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: '',// 必填,公众号的唯一标识 timestamp:,// 必填,生成签名的时间戳 nonceStr: '',// 必填,生成签名的随机串 signature: '',// 必填,签名,见附录1 jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 });

1.微信支付类 WechatPay.PHP

代码如下:
$this->appid, "nonceStr" => $nonceStr, "timestamp" => $timestamp, "url" => $url, "signature" => $signature, "rawString" => $string ); return $signPackage; } public static function getJsApiTicket() { //使用Redis缓存 jsapi_ticket $redis = Yii::$app->redis; $redis_ticket = $redis->get('wechat:jsapi_ticket'); if ($redis_ticket) { $ticket = $redis_ticket; } else { $accesstoken = self::getAccesstoken(); $url = "; $res = json_decode(self::curlGet($url)); $ticket = $res->ticket; if ($ticket) { $redis->set('wechat:jsapi_ticket',$ticket); $redis->expire('wechat:jsapi_ticket',7000); } } return $ticket; } public static function getAccessToken() { //使用Redis缓存 access_token $redis = Yii::$app->redis; $redis_token = $redis->get('wechat:access_token'); if ($redis_token) { $access_token = $redis_token; } else { $appid = Yii::$app->params['wechat']['appid']; $appsecret = Yii::$app->params['wechat']['appsecret']; $url = "; $res = json_decode(self::curlGet($url)); $access_token = $res->access_token; if ($access_token) { $redis->set('wechat:access_token',$access_token); $redis->expire('wechat:access_token',7000); } } return $access_token; } public static function curlGet($url = '',1); } return $str; } }

2.获取config参数接口

params['wechat']['appid']; $mchid = Yii::$app->params['wechat']['mchid']; $key = Yii::$app->params['wechat']['key']; $wx_pay = new WechatPay($mchid,$key); $package = $wx_pay->getSignPackage($url); $result['error'] = 0; $result['msg'] = '获取成功'; $result['config'] = $package; } else { $result['error'] = 1; $result['msg'] = '参数错误'; } return $result; }

以上就是利用Yii2微信后台开发全部过程及示例代码,希望本文对大家基于PHP的微信公众平台开发有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐