快捷搜索:
来自 新京葡娱乐场网址 2019-06-19 12:14 的文章
当前位置: 67677新澳门手机版 > 新京葡娱乐场网址 > 正文

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

李秉骏:在Phonegap下实现oAuth认证

2012/07/18 · HTML5 · 2 评论 · 来源: 李秉骏     · HTML5

本文由李秉骏(@CashLee李秉骏)投稿于伯乐在线,也接待任何朋友投稿。提醒:投稿时记得留下乐乎账号哦 图片 1

这段时间做过三次关于Phonegap的当场交换会议分享。基本上把Phonegap的片段个性和我们调换了一晃,大家对此Phonegap的 兴趣也是相当多的。可是因为Phonegap相对于原生应用来讲,唯有一个View,那么些View就是五个Web的容器,那使得Phonegap就存在繁多限制。当中部分的限制我们曾经经过HTML5的API以及Phonegap为大家搭建的桥去达成了,其余一些大家就得经过Phonegap plugins来贯彻,而实际上本人个人认为Phonegap最强大的地点也在于有那么大的一个群众体育在为她提供五花八门的Plugins,以便去应对实在项 目中境遇的题目。

本人记念在和我们交流的时候我们常常会问Phonegap咋办地点的缓存啊(WebSQL),如何近乎原生应用(那几个涉及到架构,分界面渲染难点,这 里本人也倒霉深远讲,毕竟不是本文要研究的剧情),还会有多少个很咳嗽的难题正是只要要做多个开放平台的使用,怎样落到实处oAuth认证。在此以前自家也境遇过类似的一 些景况,当自个儿再也相见这些棘手的主题材料的时候,作者深信必将也许有Phonegap的观众境遇类似的景况的。于是笔者就总结下来何大家研商一下怎么缓和这几个主题素材吧。

第一指标:消除oAuth认证。

制定安顿:1. 知道oAuth原理;2.掌握Phonegap在拍卖那几个主题素材时候的运转搭飞机制;3. 制定布置落到实处代码。

上面大家就来一步一步地深入分析,看怎么着消除那个状态吗。(因为自己在品种中相遇的是Tencent和讯开放平台的oAuth认证,那么上面作者就用腾讯oAuth认证为例吧)

关于oAuth认证,相信做过开放平台应用的爱侣都早就不行熟知了,倘诺你还未有做过可能对于oAuth认证流程特别不驾驭,那么自个儿建议你先驾驭一 下原理,在此间小编不期待花太多的字数去介绍这几个事物,因为在众多地点都得以找到,上边我引入八个地方方便我们去阅读,一定要读书,那会对您知道上面包车型客车小说有中度的匡助的。

腾讯和讯开放平台:

微博和讯开放平台:

本来在此间上边供给演说表达的是oAuth认证机制是三个通用的招数,不过因为种种开放平台有谈得来的政策,因而大概在在那之中稍有变动,而且最终获得的权力也会各分裂。而近日今日头条微博实在太多坑爹的业务了,实在忍受不住,于是本人转战到腾讯的阳台了。

好的,倘使您看完了oAuth认证的流水生产线,就一贯到此地来。无人不知,在oAuth认证的流程中,有二个授权页面,而那几个授权页面是通过开放平台提供的,具体的体制见下图:

图片 2

其一页面用于输入开放平台的帐户以及密码,通过授权获取响应的openid以及openkey,最后换取access-token(待会笔者会结合腾讯微博oAuth认证流程的表征,以及代码和大家深入分析的)。

其一页面是弹出的,要是在Phonegap里面做的话会很古怪:1,因为属于弹窗,在Phonegap中本人正是一个WebView如若你还弹的话 就能飞到了Safari的浏览器中,那就跳出应用自己,跳出来认证还应该有戏啊?2,通过iFrame,首先体验十二分倒霉,其次iFrame本身又属于跨域的 难点,那就不佳化解了(为何体验倒霉呢,首如若因为授权页面包车型大巴体裁是不固定的,类似果壳网易开放平台,就比微博的授权页面做得差,根本不和手提式有线话机包容的, 而且某个做得好的,认证页宽度就是320px,就占了您全部应用的版面,体验很倒霉)那么Phonegap中该怎么贯彻啊?

带着题材,大家就期待在Phonegap中再一次引进二个WebView。刚刚提到Phonegap的精锐还在于很两人以及合法的团体,为其提供了一 套很好的插件机制,以缓和五光十色的内需。在Phonegap中有三个插件叫做ChildBrowser,从名称想到所包括的意义正是:子浏览器。(其实自身在上一遍的 Phonegap专项论题技巧分享中以及聊起到让大家用这些东西去消除,可是当下享受时间有限只好草率带过,抱歉)子浏览器的效率其实便是令你在 Phonegap应用内部调起二个浏览器的View,令你进行pdf,图片,录制,乃至网页阅读的工具。(实际上你看本人上边的截图,就是用 ChildBrowser来实现的)那就好了,那就足以令你调起浏览器而且不跳出应用本人了,能够很好地化解oAuth认证的标题。 ChildBrowser下载地址:

在地方上边,你应该早就见到ChildBrowser的装置格局以及利用办法了,极其轻松,真正的即插即用。假诺你认为英文太难,那本人就帮不了你 了,你就自动谷歌翻译一下吗。相信你赶快就足以做出二个ChildBrowser的德姆o的。在那个地方上边,其实你回来上一层目录,其实您也 已经见到琳琅满指标Phonegap Plugins,通过这一个事物,你还是能调用起手提式有线电话机内部更加多有趣的能源的!那个就要靠你和睦去开掘啦!(别的平台的选择也许有对应的插件的Android开拓者不要骂果粉哦!)

好了日益地大家将在涉及到代码部分了。首先大家看看调用ChildBrowser的Javascript代码:

JavaScript

cb = window.plugins.childBrowser; /* if(cb != null) { cb.onLocationChange = function(loc){ root.locChanged(loc); };//地址产生更换时候执行的函数 cb.onClose = function(){root.onCloseBrowser(); };//通过js关闭ChildBrowser的主意 cb.onOpenExternal = function(){root.onOpenExternal(); }; */ cb.showWebPage("");

1
2
3
4
5
6
7
8
        cb = window.plugins.childBrowser;
/*
        if(cb != null) {
        cb.onLocationChange = function(loc){ root.locChanged(loc); };//地址发生改变时候执行的函数
        cb.onClose = function(){root.onCloseBrowser(); };//通过js关闭ChildBrowser的办法
        cb.onOpenExternal = function(){root.onOpenExternal(); };
*/
        cb.showWebPage("http://google.com");

中间cb便是开端化的ChildBrowser,而showWebPage正是调起那些页面包车型大巴办法。可知代码中要开采的网站正是谷歌.com啦,这么些地球人都能够看得懂了。于是大家就可以登时想到大家要用ChildBrowser展开的网站是大家在英特网钦点的采纳授权站点 了。而自己是布署在SAE上面的,所以下边包车型地铁例证也用PHP来讲吧,期待语言也是同等的道理,转义就能够了。在说代码在此以前,大家先来说说现实通信的流水生产线,以 及我们接下去要落成的对象。

图片 3
在此间,我们的手提式有线电话机端是经过走访SAE服务器,由SAE服务器管理数据并与腾讯乐乎开放平台通讯的,这里手提式有线电话机端并不曾一向和腾讯果壳网开放平台通讯(笔者如此 管理的缘故是1,方便在劳动器端管理帐户,那样的话可以观测本人的行使的帐户情状;2,服务器端完毕推送机制,方便管理token以及做api;3,服务 器端还足以和别的开放平台帐户绑定)。由此,我们的全部认证方案会在服务器端落成。

而基于腾讯乐乎开放平台,大家第一会在开放平台上面注册本身的选拔,注册的流水生产线以及艺术本身不说了,注册的地点是:,注册你的施用后,你对号入座能够获取的事物是:

JavaScript

动用名称:mobile_test_api 应用项目:客户端应用 App Key:88888888 App Secret:ainidenideiienfeomeomroemrome

1
2
3
4
应用名称:mobile_test_api
应用类型:客户端应用
App Key:88888888
App Secret:ainidenideiienfeomeomroemrome

在那边小编的App key以及App Secret是假的(你懂的,你应当有您自身的),上边大家就选取腾讯提要求我们的PHP SDK,下载地址:。有了SDK后大家就足以把SDK放到本人的境遇方面,然后配置服务器端的代码了。下图是作者归纳安顿的服务端的代码,lib下存放的正是腾讯果壳网的sdk。当然实际生产条件和那几个有两样。这里仅仅作为示范使用:

图片 4

下边就依照Tencent天涯论坛认证的流水生产线,逐一解说一下那一个文件以及中间的代码吧。

index.php

PHP

<?php require_once 'app_config.php'; $url=" header('Location:'.$url);

1
2
3
4
5
6
<?php
require_once 'app_config.php';
 
$url="https://open.t.qq.com/cgi-bin/oauth2/authorize?client_id=".$client_id."&APP_KEY=".$app_key."&wap=2&response_type=code&redirect_uri=http://yoururl.com/get_auth.php";//指定URL地址
 
header('Location:'.$url);

那边引进的app_config.php

PHP

<?php $client_id = '8888888888'; $app_key = 'anienineiienrieireowq2839289';

1
2
3
4
5
<?php
 
$client_id = '8888888888';
 
$app_key = 'anienineiienrieireowq2839289';

因为根据Tencent新浪开放平台,我们率先步要博取的是Code,如下所述,大家要做的正是盘活铺排,获取这么些Code

JavaScript

率先步:请求code 请求方法: GET 请求地址: 重返结果: 若是授权成功,授权服务器会将用户的浏览重视定向到redirect_uri,并带上code,openid和openkey等参数,重定向的url如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
第一步:请求code
 
请求方法:
GET
 
请求地址:
 
https://open.t.qq.com/cgi-bin/oauth2/authorize?client_id=APP_KEY&amp;response_type=code&amp;redirect_uri=http://www.myurl.com/example
 
返回结果:
如果授权成功,授权服务器会将用户的浏览器重定向到redirect_uri,并带上code,openid和openkey等参数,重定向的url如下:
 
http://www.myurl.com/example?code=CODE&amp;openid=OPENID&amp;openkey=OPENKEY

切切实实要求请求附带的参数,须要求依据oAuth2.0鉴权的页面提示的进展。()

下一场大家再来看看大家所陈设的文件:

get_auth.php

PHP

<?php require_once 'app_config.php'; $code = $_REQUEST['code']; $openid = $_REQUEST['openid']; $openkey = $_REQUEST['openkey']; $url = ""; $message = file_get_contents($url); /* success to print the access token message */ $access = explode("=",$message); print_r("<br />"); $access_message = explode("&",$access[1]); $access_token = $access_message[0]; $user_name = $access[4]; print_r($access_token ." " . $user_name);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
 
require_once 'app_config.php';
 
$code = $_REQUEST['code'];
 
$openid = $_REQUEST['openid'];
 
$openkey = $_REQUEST['openkey'];
 
$url = "https://open.t.qq.com/cgi-bin/oauth2/access_token?client_id=".$client_id."&client_secret=".$app_key."&grant_type=authorization_code&code=".$code."&redirect_uri=http://yoururl.com/get_auth.php";
 
$message = file_get_contents($url);
 
/* success to print the access token message */
 
$access = explode("=",$message);
 
print_r("<br />");
 
$access_message = explode("&",$access[1]);
 
$access_token = $access_message[0];
 
$user_name = $access[4];
 
print_r($access_token ."   " . $user_name);

实际到以上结束,大家的安顿文件已经弄好了。在这几个布局文件中,实际上大家要做的正是腾讯博客园开放平台北谈起的第二步:

JavaScript

其次步:请求accesstoken 请求地址: 重返结果: 重返字符串: access_token=ACCESS_TOKEN&expires_in=60&refresh_token=REFRESH_TOKEN

1
2
3
4
5
6
7
8
9
第二步:请求accesstoken
 
请求地址:
 
https://open.t.qq.com/cgi-bin/oauth2/access_token?client_id=APP_KEY&amp;client_secret=APP_SECRET&amp;redirect_uri=http://www.myurl.com/example&amp;grant_type=authorization_code&amp;code=CODE
 
返回结果:
返回字符串:
access_token=ACCESS_TOKEN&amp;expires_in=60&amp;refresh_token=REFRESH_TOKEN

若果您今后已经安插好你的劳务端口,已经配备好手提式有线电电话机端的ChildBrowser,你就已经能够在三哥伦比亚大学方面看看整个认证的流水线了。以往的干活早已完毕了绝大多数了,可是仔细的爱人恐怕会发觉,对啊,认证是变成了,手提式有线电话机上照旧尚未拿走授权啊,因为授权后的音讯还不可见通过手提式有线电话机去得到。不要 急,ChildBrowser风趣的地点还尚无完呢。在小叔子大端方面大家做到了oAuth认证,总有局地参数重回,不管accesstoken是不是存在手机端,你不能够不有个帐户机制和服务端通信。笔者的服务端在SAE上边,笔者就确立贰个唯一id给手提式有线电话机,于是小编就建设构造了贰个帐户机制,存在服务端上,服务端上囤积的事物是:

MySQL

CREATE TABLE IF NOT EXISTS `auth_user` ( `id` int(10) NOT NULL AUTO_INCREMENT, `muser` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `access_token` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `openid` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `openkey` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

1
2
3
4
5
6
7
8
9
10
CREATE TABLE IF NOT EXISTS `auth_user` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `muser` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `access_token` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `openid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `openkey` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

其实那一个表也还未曾宏观,小编不能够不还要纪录那么些用户是还是不是在线(如若有推送机制)。此后手提式有线电话机端和服务端通信就由此地点的id以及token等的音讯实行通信,再通过服务端想腾讯博客园张开api的通信,获取我们想要的新闻。那么表明后大家透过哪些路线得到表明后回到的音信呢?我们看看下面JS调节ChildBrowser的代码。会发觉个中有贰个办法:

JavaScript

cb.onLocationChange = function (loc){ console.warn(loc); };

1
cb.onLocationChange = function (loc){ console.warn(loc); };

倘令你在xCode上边跑这段代码的话,你会发觉loc打出去的是历次ChildBrowser里面浏览的网页改换的地址。这一年大家就可以顺水推舟,依照这里提供的主意,用url的法门把地方重临到Phonegap负担逻辑管理的JS代码中,相同的时间将有关需求通信的音讯也回到。重返后还能透过回 调的措施实践关闭ChildBrowser的代码:

JavaScript

cb.close();

1
cb.close();

本来,你还能实行愈来愈多异步请求的代码。至于说还足以由此怎么样的章程实行报纸发表其实还会有多数办法,作者那边唯有是提供一下思路引导以及艺术。具体的 话,还要施行出真理论,做到特别安全的电视发表还值得大家继续深入斟酌。那么作者要介绍的光景就到那边停止。因为其实项目中大家还或者有push notification的机制,所今后来自家应当还可能会联同@Jeff_Kit 达成一下Phonegap的推送方案,并整理出sdk,成文后开放出来方便大家交换。

对于本文若是有怎样疑点依然建议都足以一直向自家反映,小编的天涯论坛网易是:@CashLee李秉骏 ,笔者还时不经常分享部分代码片段在github上边(开源的肥力相当少,所以开源项目较少,希望以后增添吗。)作者的Github账号, 应接您和自个儿时时四处进行调换,也冀望Phonegap的炎黄开辟者社区会变得进一步卓越。

注意:ChildBrowser控件在实质上条件中因为安全难点大概须求修改,通信进程中参数也提议加密。:-)

 

正文由李秉骏(@CashLee李秉骏)投稿于伯乐在线,也招待任何朋友投稿。提醒:投稿时记得留下和讯账号哦 图片 5

【如需转发,请标记并保留原来的书文链接和小编等音讯,多谢同盟!】

 

 

1 赞 收藏 2 评论

图片 6

英特网有多数有关YII2.0微信支付教程,不过太过复杂凌乱,所从前些天在这里给大家整理总计运用Yii2微信后台开辟的一类别了,给须要的伙伴们仿照效法。

一:接入微信

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' => 'yiirestUrlRule',
  'controller' => 'wechat',
  'extraPatterns' => [
  'GET valid' => 'valid',
  ],
 ],
 ],
],

3.在app/controllers中新建WechatController

<?php

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,$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;
  }
 }
 }

}

微信公众号后台配置

在微信公众号后台配置UHighlanderL和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 = '';
    //初阶化贰个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 = '';
    //初步化二个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.取得用户资料接口

本文由67677新澳门手机版发布于新京葡娱乐场网址,转载请注明出处:完美利用Yii2微信后台开发的系列总结

关键词: