您的位置:澳门新葡8455最新网站 > Web前端 > 周详应用Yii2Wechat后台开垦的数不完总结_php能力

周详应用Yii2Wechat后台开垦的数不完总结_php能力

发布时间:2019-12-02 18:02编辑:Web前端浏览(116)

    李秉骏:在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认证,那么上面笔者就用TencentoAuth认证为例吧)

    至于oAuth认证,相信做过开放平台应用的相恋的人都早已不行熟识了,如若您还还未有做过大概对于oAuth认证流程特别不明白,那么小编建议您先领悟一 下原理,在这里地笔者不期望花太多的篇幅去介绍这么些事物,因为在不计其数地点都能够找到,下边作者引进八个地点方便大家去阅读,必定要读书,这会对您知道上面包车型地铁稿子 有中度的支持的。

    Tencent博客园开放平台:

    天涯论坛博客园开放平台:

    当然在那上边供给演讲表达的是oAuth认证机制是贰个通用的花招,然则因为种种开放平台有温馨的安排,由此或然在内部稍有转移,並且最终收获的权限也会各不相仿。而多年来天涯论坛和讯实在太多坑爹的作业了,实在忍受不住,于是本人转战到Tencent的阳台了。

    好的,若是你看完了oAuth认证的流程,就径直到那边来。无人不晓,在oAuth认证的流水生产线中,有一个授权页面,而以此授权页面是由此开放平台提供的,具体的样式见下图:

    图片 2

    其风流倜傥页面用于输入开放平台的帐户以至密码,通过授权获取响应的openid以至openkey,最后换取access-token(待会小编会结合Tencent和讯oAuth认证流程的表征,以至代码和大家拆解剖析的)。

    其风姿洒脱页面是弹出的,假诺在Phonegap里面做的话会很古怪:1,因为属于弹窗,在Phonegap中本身便是多个WebView借使你还弹的话 就能飞到了Safari的浏览器中,那就跳出应用自己,跳出来认证还恐怕有戏呢?2,通过iFrame,首先体验特别糟糕,其次iFrame自个儿又归属跨域的 难题,这就不好消除了(为啥体验倒霉呢,首假使因为授权页面包车型地铁体制是不固定的,相仿Tencent博客园开放平台,就比腾讯网的授权页面做得差,根本不和手提式有线电电话机包容的, 而且有个别做得好的,认证页宽度正是320px,就占了您全数应用的版面,体验十分不好)那么Phonegap中该怎么兑现啊?

    带着难点,大家就梦想在Phonegap中再一次引进一个WebView。刚刚提到Phonegap的强硬还在于很四人以致官方的集体,为其提供了风流倜傥套很好的插件机制,以清除丰富多彩的急需。在Phonegap中有二个插件叫做ChildBrowser,看名就能够猜到其意义正是:子浏览器。(其实我在上三回的 Phonegap专项论题本领分享中以致谈起到让我们用这一个东西去消除,但是当下享受时间有限只可以够草率带过,抱歉)子浏览器的成效其实正是令你在 Phonegap应用内部调起叁个浏览器的View,让你进行pdf,图片,录制,甚至网页阅读的工具。(实际上你看自身下边包车型大巴截图,就是用 ChildBrowser来实现的)那就好了,那就足以令你调起浏览器何况不跳出应用本身了,能够很好地消除oAuth认证的主题素材。 ChildBrowser下载地址:

    在地点上边,你应当早就看见ChildBrowser的设置情势以至利用方式了,特别简单,真正的即插即用。假若你感觉República Portuguesa语太难,那自个儿就帮不了你 了,你就自动谷歌(Google卡塔尔国翻译一下吗。相信您急速就足以做出一个ChildBrowser的德姆o的。在此个地址下边,其实你回到上豆蔻梢头层目录,其实您也 已经旁观琳琅满指标Phonegap Plugins,通过这几个事物,你还足以调用起手提式无线电话机内部更加的多有意思的能源的!这一个将要靠你和睦去开掘啦!(其他平台的接纳也可以有照管的插件的Android开发者不要骂果粉哦!)

    好了日益地我们将要涉及到代码部分了。首先我们看看调用ChildBrowser的Javascript代码:

    JavaScript

    cb = window.plugins.childBrowser; /* if(cb != null卡塔尔(英语:State of Qatar) { cb.onLocationChange = function(loc卡塔尔(英语:State of Qatar){ root.locChanged(loc卡塔尔(英语:State of Qatar); };//地址产生改造时候实行的函数 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正是调起那些页面包车型客车形式。可以预知代码中要张开的网站就是Google.com啦,那个地球人都能够看得懂了。于是我们就可以立时想到大家要用ChildBrowser张开的网站是我们在网络钦定的采纳授权站点 了。而本身是安顿在SAE上边的,所以上面包车型地铁例子也用PHP来讲呢,期望语言也是同豆蔻年华的道理,转义就足以了。在说代码以前,大家先来讲说现实通信的流水生产线,以及大家接下去要落成的靶子。

    图片 3
    在此边,我们的手提式有线电话机端是由此访谈SAE服务器,由SAE服务器处理数据并与Tencent微博开放平台通信的,这里手提式有线电话机端并从未一向和Tencent天涯论坛开放平台通讯(笔者那样 管理的原因是1,方便在服务器端管理帐户,那样的话能够洞察自身的使用的帐户境况;2,服务器端完结推送机制,方便管理token以致做api;3,服务 器端仍然为能够和任何开放平台帐户绑定)。因而,我们的满贯认证方案会在劳务器端达成。

    而依赖Tencent知乎开放平台,大家第一会在开放平台上边注册本身的利用,注册的流程甚至艺术本人不说了,注册之处是:,注册你的接纳后,你对症用药能够赢得的事物是:

    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是假的(你懂的,你应有有您本人的),下边大家就使用Tencent提必要我们的PHP SDK,下载地址:。有了SDK后大家就可以把SDK放到自个儿的条件方面,然后配置服务器端的代码了。下图是本人轻松布署的服务端的代码,lib下贮存的正是Tencent微博的sdk。当然实际生育条件和这一个有例外。这里唯有看做示范使用:

    图片 4

    下边就依据腾讯微博表达的流水生产线,逐黄金年代讲授一下这一个文件以至中间的代码吧。

    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等的新闻进行通信,再通过服务端想Tencent微博实行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微信支付教程,不过太过复杂凌乱,所以今天在此给咱们收拾计算运用Yii2Wechat后台开采的意气风发连串了,给须要的同伴们参谋。

    一:接入微信

    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

    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  { echo 'TOKEN is not defined!'; } else { $tmpArr = array($token, $timestamp, $nonce); // use SORT_STRING rule sort; $tmpStr = implode; $tmpStr = sha1; if( $tmpStr == $signature ){ return true; }else{ return false; } } }}
    

    在Wechat民众号后台配置URAV4L和Token,然后提交证明就可以。

    URL:http://app.demo.com/wechats/validToken:your token
    

    二:获取客商音信

    复制代码 代码如下:CREATE TABLE `wechat_user` NOT NULL, `openid` varchar COLLATE utf8_unicode_ci NOT NULL, `nickname` varchar COLLATE utf8_unicode_ci NOT NULL COMMENT 'Wechat别称', `sex` tinyint NOT NULL COMMENT '性别', `headimgurl` varchar COLLATE utf8_unicode_ci NOT NULL COMMENT '头像', `country` varchar COLLATE utf8_unicode_ci NOT NULL COMMENT '国家', `province` varchar COLLATE utf8_unicode_ci NOT NULL COMMENT '省份', `city` varchar COLLATE utf8_unicode_ci NOT NULL COMMENT '城市', `access_token` varchar COLLATE utf8_unicode_ci NOT NULL, `refresh_token` varchar 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 ;

    获得客商消息的相干接口

    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; $result = $this->response; //获取token和openid成功,数据深入深入分析 $access_token = $result['access_token']; $refresh_token = $result['refresh_token']; $openid = $result['openid']; //乞请Wechat接口,获取客商消息 $userInfo = $this->getUserInfo($access_token,$openid); $user_check = WechatUser::find(卡塔尔->where->one { //更新客户资料 } else { //保存顾客资料 } //前端网页的重定向 if { return $this->redirect; } else { return $this->redirect; }}

    2.从Wechat获取客商资料

    复制代码 代码如下: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; $result = $this->response; return $result;}

    public function actionUserinfo(){ if(isset{ $openid = $_REQUEST["openid"]; $user = WechatUser::find()->where->one { $result['error'] = 0; $result['msg'] = '获取成功'; $result['user'] = $user; } else { $result['error'] = 1; $result['msg'] = '没有该用户'; } } else { $result['error'] = 1; $result['msg'] = 'openid为空'; } return $result;}
    

    三:Wechat支付

    1.Wechat支出接口:打包支付多少

    复制代码 代码如下:public function actionPay(卡塔尔(قطر‎{ if(isset&&isset&&isset($_REQUEST["totalFee"])){ //uid、oid、totalFee $uid = $_REQUEST["uid"]; $oid = $_REQUEST["oid"]; $totalFee = $_REQUEST["totalFee"]; $timestamp = time(卡塔尔国; //Wechat支付参数 $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; $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.收下Wechat发送的异步支付结果通报

    复制代码 代码如下:public function actionNotify(卡塔尔(英语:State of Qatar){ $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); // if { die; } if ($postObj->return_code != 'SUCCESS') { die; } if ($postObj->result_code != 'SUCCESS'卡塔尔 { die; } //Wechat支付参数 $appid = Yii::$app->params['wechat']['appid']; $mchid = Yii::$app->params['wechat']['mchid']; $key = Yii::$app->params['wechat']['key']; $wx_pay = new 微信Pay; //验证具名 $arr = $postObj; unset; if ($wx_pay->getSign != $postObj->sign卡塔尔 { die; } //支付处理正确-决断是还是不是已管理过支付景况$orders = Order::find(卡塔尔->where(['uid'=>$postObj->openid, 'oid'=>$postObj->out_trade_no, 'status' => 0]卡塔尔(قطر‎->all > 0卡塔尔(قطر‎{ //更新订单状态 foreach { //更新订单 $order['status'] = 1; $order->update(卡塔尔(قطر‎; } return ''; } else { //订单状态已履新,间接回到 return ''; }}

    3.Wechat支付类 WechatPay.php

    复制代码 代码如下:mchid = $mchid; $this->appid = $appid; $this->key = $key; } public function createJsBizPackage($openid, $totalFee, $outTradeNo, $orderName, $notifyUrl, $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, 'trade_type' => 'JSAPI', ); $unified['sign'] = self::getSign($unified, $config['key']); $responseXml = self::curlPost('', self::arrayToXml; $unifiedOrder = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA); if ($unifiedOrder === false) { die; } 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_signType" => 'MD5', ); $arr['paySign'] = self::getSign; return $arr; } public static function curlGet($url = '', $options = array{ $ch = curl_init; curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 30); if { curl_setopt_array; } //https哀告 不表达证书和host curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $data = curl_exec; return $data; } public static function curlPost($url = '', $postData = '', $options = array{ if { $postData = http_build_query; } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt; curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_TIMEOUT, 30卡塔尔(英语:State of Qatar); //设置cU本田CR-VL允许实施的最长秒数 if { curl_setopt_array; } //https央浼 不表明证书和host curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $data = curl_exec; return $data; } public static function createNonceStr{ $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $str = ''; for ($i = 0; $i"; foreach { if { $xml .= "" . $val . "" . $key . ">"; } else { $xml .= "" . $key . ">"; } } $xml .= ""; return $xml; } public static function getSign{ ksort; $unSignParaString = self::formatQueryParaMap; $signStr = strtoupper(md5($unSignParaString . "&key=" . $key)); return $signStr; } protected static function formatQueryParaMap($paraMap, $urlEncode = false){ $buff = ""; ksort; foreach { if (null != $v && "null" != $v) { if { $v = urlencode; } $buff .= $k . "=" . $v . "&"; } } $reqPar = ''; if { $reqPar = substr($buff, 0, strlen; } return $reqPar; }}

    四:获取JS-SDK的config参数

    传说Wechat大伙儿平台开采者文书档案:

    抱有需求运用JS-SDK的页面必需先注入配置消息,不然将无法调用(同叁个url仅需调用一遍,对于变化url的SPA的web app可在每趟url变化时开展调用,近年来AndroidWechat客商端不帮忙pushState的H5新个性,所以接受pushState来促成web app的页面会产生签字战败,此主题材料会在Android6.第22中学期维修复)。

    复制代码 代码如下:wx.config({ debug: true, // 开启调节和测验情势,调用的保有api的回来值会在客商端alert出来,若要查看传入的参数,能够在pc端张开,参数音信会通过log打出,仅在pc端时才会打字与印刷。 appId: '', // 必填,大伙儿号的天下无双标志 timestamp: , // 必填,生成签字的年月戳 nonceStr: '', // 必填,生成具名的妄动串 signature: '',// 必填,具名,见附录1 jsApiList: [] // 必填,须求利用的JS接口列表,全部JS接口列表见附录2}卡塔尔(قطر‎;

    1.Wechat支付类 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 { $ticket = $redis_ticket; } else { $accessToken = self::getAccessToken(); $url = "; $res = json_decode; $ticket = $res->ticket; if { $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 { $access_token = $redis_token; } else { $appid = Yii::$app->params['wechat']['appid']; $appsecret = Yii::$app->params['wechat']['appsecret']; $url = "; $res = json_decode; $access_token = $res->access_token; if { $redis->set('wechat:access_token', $access_token); $redis->expire('wechat:access_token', 7000); } } return $access_token; } public static function curlGet($url = '', $options = array{ $ch = curl_init; curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 30); if { curl_setopt_array; } //https央求 不表达证书和host curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $data = curl_exec; return $data; } public static function curlPost($url = '', $postData = '', $options = array{ if { $postData = http_build_query; } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt; curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_TIMEOUT, 30卡塔尔; //设置cUOdysseyL允许实行的最长秒数 if { curl_setopt_array; } //https央求 不表明证书和host curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $data = curl_exec; return $data; } public static function createNonceStr{ $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $str = ''; for ($i = 0; $i

    2.获取config参数接口

    public function actionConfig(){ if (isset { $url = $_REQUEST['url']; //微信支付参数 $appid = Yii::$app->params['wechat']['appid']; $mchid = Yii::$app->params['wechat']['mchid']; $key = Yii::$app->params['wechat']['key']; $wx_pay = new WechatPay; $package = $wx_pay->getSignPackage; $result['error'] = 0; $result['msg'] = '获取成功'; $result['config'] = $package; } else { $result['error'] = 1; $result['msg'] = '参数错误'; } return $result;}
    

    以上便是采纳Yii2Wechat后台开拓总体进度及示范代码,希望本文对大家基于php的Wechat群众平台支付具备助于。

    本文由澳门新葡8455最新网站发布于Web前端,转载请注明出处:周详应用Yii2Wechat后台开垦的数不完总结_php能力

    关键词:

上一篇:没有了

下一篇:没有了