加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

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

发布时间:2020-05-23 11:41:36 所属栏目:PHP 来源:互联网
导读:Yii2是一个高性能,基于组件的 PHP 框架,这篇文章详细的给大家介绍了利用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' => 'yiirestUrlRule','controller' => 'wechat','extraPatterns' => [ 'GET valid' => 'valid',

3.在app/controllers中新建WechatController

namespace apicontrollers;

use Yii;
use yiirestActiveController;

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,然后提交验证即可。

二:获取用户信息

用户表设计

代码如下:

获取用户信息的相关接口

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参数

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

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读