完美利用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; class WechatController extends ActiveController public $modelClass = ''; public function actionValid() private function checkSignature($signature,$nonce) if( $tmpStr == $signature ){ } 微信公众号后台配置 在微信公众号后台配置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 ' 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 = " 四:获取JS-SDK的config参数根据微信公众平台开发者文档: (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
