完善应用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.
制订陈设达成代码。

上面大家就来一步一步地剖析,看哪样缓解这几个景况吧。(因为自己在项目中遇见的是腾讯微博开放平台的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的设置形式以及利用方法了,相当简单,真正的即插即用。若是你以为英文太难,那我就帮不了你
了,你就自动谷歌(Google)翻译一下吗。相信你神速就足以做出一个ChildBrowser的Demo的。在那么些地点上边,其实你回到上一层目录,其实您也
已经见到各式各类的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

上面就按照腾讯天涯论坛认证的流水线,逐一讲解一下那几个文件以及中间的代码吧。

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’;

因为按照腾讯天涯论坛开放平台,大家率先步要博得的是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&response_type=code&redirect_uri=http://www.myurl.com/example
 
返回结果:
如果授权成功,授权服务器会将用户的浏览器重定向到redirect_uri,并带上code,openid和openkey等参数,重定向的url如下:
 
http://www.myurl.com/example?code=CODE&openid=OPENID&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&client_secret=APP_SECRET&redirect_uri=http://www.myurl.com/example&grant_type=authorization_code&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微信后台开发的多重计算,浅谈管理种类操作日志设计。  相关文章链接:《系统操作日志设计》
  在初步做事先,必须把两个日志分清楚,这就是平时操作日志业务操作日志,那两者有啥不相同?
  在本人驾驭,普通操作日志就是单表的操作记录,而工作操作日志则就是一一日千里的平凡操作日志的集结。
  打个比方,用户必要购置同一宝贝,已经到了下单那步,下单就是个工作,这些工作背后就是一密密麻麻的事体,如:
  生成订单 → 生成商品快照 → 发送一条站内信 → 删除购物车里对应宝贝
  那样一个下单操作就隐含了4局地,可以把这4片段当作是4张表,分别对那4张表举行相应的操作,就落到实处了作业。
  但前日自家要讲的不是业务操作日志,因为分歧系列的工作不完全一样,所以它不能做成通用模块,而自我要讲的,就是普普通通操作日志。
  上面表明了一大段,上边干货就要亮相了,先洗把脸清醒下。
  ……
  首先,哪些地点须要记录操作日志?执行insert、update、delete这3个操作的时候,就须求展开日志,而日志执行的先后顺序如下
insert
在insert后执行

https://my.oschina.net/wingyiu/blog/153357

一:接入微信

update
在update前后都要履行,操作前获取操作前数据,操作后获取操作后数据

MYSQL 5.5 以前, UTF8
编码只帮忙1-3个字节,只协助BMP这部分的unicode编码区,
BMP是从哪到哪,到http://en.wikipedia.org/wiki/Mapping\_of\_Unicode\_characters此处看,基本就是0000~FFFF这一区。
从MYSQL5.5起来,可支撑4个字节UTF编码utf8mb4,一个字符最多能有4字节,所以能支撑愈多的字符集。

Yii2后台配置

delete
在delete前执行

utf8mb4 is a superset of utf8
utf8mb4包容utf8,且比utf8能代表越多的字符。

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

逐条清楚后,就来看下我写的一份日记操作类吧,第一版随便写写的,重复代码有点多,还将来得及优化。
+ View
Code

关于哪些时候用,看你的做怎么着项目了。。

return [
 //微信接入
 'wechat' =>[
 'token' => 'your token',
 ],
];

运用前,须求引入数据库操作类,那是自我在此以前写的一份,可参照《崭新的PDO数据库操作类(仅适用Mysql)》。
  引入之后,就足以开首运用了。
  select
1

在做运动使用时,会遭逢ios用户会在文件的区域输入emoji表情,倘若不做肯定处理,就会招致插入数据库万分。

2.在app/config/main.php中布局路由

$log
->insert(82,
‘tb_member’
);

Emoji表情符号包容方案

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

update
1
2
3

一 什么是Emoji

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

$log
->updateStart(82,
‘tb_member’
);

  emoji就是表情符号;词义来自日语(えもじ,e-moji,moji在日语中的含义是字符) 

3.在app/controllers中新建WechatController

//中间放更新操作代码

表情符号现已普遍采纳于手机短信和网络聊天软件。
  emoji表情符号,在国外的手机短信里面早已是很盛行使用的一种表情。
  手机上哪些利用emoji:
  1.iphone、ipad系统:安装emoji
free,再设置-通用-键盘-国际键盘-添加新的键盘,然后把emoji添加在中间即可在发短信和有些输入文本的文本框中输入表情。
  IOS 5用户可径直从通用中添加emoji 键盘,无需再安装emoji free
  2.android连串:安装“GO输入法兰西际版”后,在输入法里面点选安装emoji插件可以利用。别的“百度输入法”也自带emoji表情
  3.Windows Phone : 安装此 Emoji
Keys,在其中输入之后复制粘贴到需要输入表情的地方即可
<此段摘自百度百科
http://baike.baidu.com/view/2631589.htm>

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

}

$log
->updateEnd();

二 Emoji表情符号难题
1 问题:
IOS版本之间发送的Emoji表情符号不匹配,只看到方块
今非昔比IOS版本在数额库存数量时,有时会生出系统错误
2 现象:
IOS 4 输入Emoji表情符,在IOS5.01
呈现正常,在IOS5.1中(大陆版)显现为四方,
但IOS5.01/5.1输入的表情符号,彰显正 常
IOS5.01/5.1 输入表情符,在IOS5.01/5.1中显得正常,但在IOS4.X展现为四方
输入Emoji入帖子正文, 可正常存储。 但用户昵称在IOS4.X
输入Emoji,系统正常, 而IOS5.01/5.1则提醒系统错误。
3 本质:
iOS 5 and OS X 10.7 (Lion) use the Unicode 6.0 standard ‘unified’ code
points for emoji.
iOS 5 Emoji 选用Unicode 6 标准来统一code points

微信公众号后台配置

delete
1

 iOS 4 on SoftBank iPhones used a set of unofficial code points in the Unicode Private Use Area, and so aren't      compatible with any other systems 
 iOS 4 采用SoftBank Unicode, 一种非官方的, 采用私有Unicode 区域。 

在微信公众号后台配置URL和Token,然后提交表明即可。

$log
->
delete
(82,
‘tb_member’
);

4 举例:
one emoji symbol “tiger”, it is “\U0001f42f” in iOS5, but “\ue050” in
earlier iOS version
虎脸Emoji符号在iOS5 为Unicode:\U0001f42f;而在IOS4.x 为:\ue050
(SoftBank 编码)
其它: 按理讲, 从iOS5 应该合作在此之前版本的emoji,
但现在出现5.01本子完美包容(无论大陆版,美版,如故港版), 而5.1
大陆版面世了不般配现象(腾讯微信也出现了同一的标题)。
三 难点浅析
1 系统存储错误难点(如昵称,帖子内容)
原因:
出于IOS5.X 选择新的Unicode, 其UTF8 编码大多为4个字节,
而由于昵称/帖子内容column并没设成utf8mb4,由此储存会 发生错误。
缓解格局:
将昵称/帖子内容设成utf8mb4
2 不一致iOS 之间Emoji 不般配的标题。
原因:
iOS 5 到4 不同盟的题材,很简短,unicode6 和softbank编码的不等
iOS 4 到
5,按理说应该合作,也就是说,iOS应该自行判断要是是softbank编码,自动转成unicode6。但方今看来,
iOS5.1(大陆版)好像只帮忙unicode6, 而不帮忙softbank.
涸泽而渔办法:
客户端发送emoji-encoding: Softbank或unicode6,
由服务端分别交付相应的编码表。
四 解决方案
1 数据存储(MySQL varchar 数据类型对UTF8 协助难点)
MYSQL 5.5 从前, UTF8 编码只辅助1-3个字节,
从MYSQL5.5始发,可支持4个字节UTF编码,但要特殊标记。例如我们的帖子内容项,大家抬高了这么些支撑。服务端mysql统一存储为ios5.x也就是Unicode编码。
对应alter语句:
[sql] view plain copy
ALTER TABLE topic MODIFY COLUMN content varchar(500) CHARACTER SET
utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT ‘内容’;
2 编码转换:
iphone手机方案
客户端输入内容时候,统一存储为unicode编码(那里需求从softbank编码转换为unicode编码)。客户端请求内容的时候,须要按照分歧的客户端给出不相同的编码,ios4运用softbank编码做替换,ios5运用unicode编码直接支持。
android或wp其余手机方案:
借使没有emoji表情库,将不可以输入。针对输入难题,将统一使用unicode编码存储。客户端请求内容的时候,将联合用softbank编码,客户端须要把emoji表情符号内置到客户端,做相应的编码和img替换。
web解决方案:
参考android或wp其余手机方案
五 部分代码
1 sql代码
[sql] view plain copy
CREATE TABLE ios_emoji (
id int(11) NOT NULL AUTO_INCREMENT COMMENT ‘自增ID’,
unicode varchar(100) CHARACTER SET utf8mb4 COLLATE
utf8mb4_unicode_ci DEFAULT NULL COMMENT ‘Unicode编码’,
utf8 varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
DEFAULT NULL COMMENT ‘UTF8编码’,
utf16 varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
DEFAULT NULL COMMENT ‘UTF16编码’,
sbunicode varchar(100) CHARACTER SET utf8mb4 COLLATE
utf8mb4_unicode_ci DEFAULT NULL COMMENT ‘SBUnicode编码’,
filename varchar(100) CHARACTER SET utf8mb4 COLLATE
utf8mb4_unicode_ci DEFAULT NULL COMMENT ‘文件名’,
filebyte longblob COMMENT ‘文件内容字节’,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT
COMMENT=’ios表情编码表’;

URL:http://app.demo.com/wechats/valid
Token:your token

可以见见,一共只须求七个参数即可,分别是表ID(主键)和表名称。
  其它需求强调一点,表注释和字段注释一定要完全,因为记录的新闻包蕴注释,目标就是为了查阅的时候能知道哪些字段是干吗用的。
  上面就看下成品吧
[图表上传中。。。(1)]
[图片上传中。。。(2)]
  最后把表结构分享下,一共2张表,一张主表一张从表,主表记录操作表及操作人等新闻,从表记录操作的表字段音信。
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

2 java代码
[java] view plain copy
import java.io.UnsupportedEncodingException;
import org.apache.commons.lang.StringUtils;

二:获取用户新闻


public class IOSEmojiUtil {

用户表设计

— Table structure for tb_log

public static String[] ios5emoji ;  
public static String[] ios4emoji ;  
public static String[] androidnullemoji ;  
public static String[] adsbuniemoji;  

public static void initios5emoji(String[] i5emj,String[] i4emj,String[] adnullemoji,String[] adsbemoji){  
    ios5emoji = i5emj;  
    ios4emoji = i4emj;  
    androidnullemoji = adnullemoji;  
    adsbuniemoji = adsbemoji;  
}  

//在ios上将ios5转换为ios4编码  
public static String transToIOS4emoji(String src) {  
    return StringUtils.replaceEach(src, ios5emoji, ios4emoji);  
}  
//在ios上将ios4转换为ios5编码  
public static String transToIOS5emoji(String src) {  
    return StringUtils.replaceEach(src, ios4emoji, ios5emoji);  
}  
//在android上将ios5的表情符替换为空  
public static String transToAndroidemojiNull(String src) {  
    return StringUtils.replaceEach(src, ios5emoji, androidnullemoji);  
}  

//在android上将ios5的表情符替换为SBUNICODE  
public static String transToAndroidemojiSB(String src) {  
    return StringUtils.replaceEach(src, ios5emoji, adsbuniemoji);  
}  

//在android上将SBUNICODE的表情符替换为ios5  
public static String transSBToIOS5emoji(String src) {  
    return StringUtils.replaceEach(src, adsbuniemoji, ios5emoji);  
}  

//eg. param: 0xF0 0x9F 0x8F 0x80  
public static String hexstr2String(String hexstr) throws UnsupportedEncodingException{  
    byte[] b = hexstr2bytes(hexstr);  
    return new String(b, "UTF-8");  
}  

//eg. param: E018  
public static String sbunicode2utfString(String sbhexstr) throws UnsupportedEncodingException{  
    byte[] b = sbunicode2utfbytes(sbhexstr);  
    return new String(b, "UTF-8");  
}  

//eg. param: 0xF0 0x9F 0x8F 0x80  
public static byte[] hexstr2bytes(String hexstr){  
    String[] hexstrs = hexstr.split(" ");  
    byte[] b = new byte[hexstrs.length];  

    for(int i=0;i<hexstrs.length;i++){  
        b[i] = hexStringToByte(hexstrs[i].substring(2))[0];  
    }  
    return b;  
}  

//eg. param: E018  
public static byte[] sbunicode2utfbytes(String sbhexstr) throws UnsupportedEncodingException{  
    int inthex = Integer.parseInt(sbhexstr, 16);  
    char[] schar = {(char)inthex};  
    byte[] b = (new String(schar)).getBytes("UTF-8");  
    return b;  
}  

public static byte[] hexStringToByte(String hex) {  
    int len = (hex.length() / 2);  
    byte[] result = new byte[len];  
    char[] achar = hex.toCharArray();  
    for (int i = 0; i < len; i++) {  
        int pos = i * 2;  
        result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));  
    }  
    return result;  
}  


private static byte toByte(char c) {  
    byte b = (byte) "0123456789ABCDEF".indexOf(c);  
    return b;  
}  

public static void main(String[] args) throws UnsupportedEncodingException {  
    // TODO Auto-generated method stub  
    byte[] b1 = {-30,-102,-67}; //ios5 //0xE2 0x9A 0xBD       
    byte[] b2 = {-18,-128,-104}; //ios4 //"E018"  

    //-------------------------------------  

    byte[] b3 = {-16,-97,-113,-128};    //0xF0 0x9F 0x8F 0x80         
    byte[] b4 = {-18,-112,-86};         //E42A    


    ios5emoji = new String[]{new String(b1,"utf-8"),new String(b3,"utf-8")};  
    ios4emoji = new String[]{new String(b2,"utf-8"),new String(b4,"utf-8")};      


    //测试字符串  
    byte[] testbytes = {105,111,115,-30,-102,-67,32,36,-18,-128,-104,32,36,-16,-97,-113,-128,32,36,-18,-112,-86};  
    String tmpstr = new String(testbytes,"utf-8");  
    System.out.println(tmpstr);  


    //转成ios4的表情  
    String ios4str = transToIOS5emoji(tmpstr);  
    byte[] tmp = ios4str.getBytes();  
    //System.out.print(new String(tmp,"utf-8"));          
    for(byte b:tmp){  
        System.out.print(b);  
        System.out.print(" ");  
    }  
}  

复制代码 代码如下:


}

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`);

CREATE
TABLE
tb_log (

六 参考资料
1 Emoji 全编码表:(我参考的那一个)
http://punchdrunker.github.com/iOSEmoji/table\_html/flower.html
2 Emoji全编码表
http://code.iamcal.com/php/emoji/

收获用户新闻的连锁接口

tbid
bigint
(20)
NOT
NULL
AUTO_INCREMENT,

3 iOS5/4 Emoji 兼容性:
http://stackoverflow.com/questions/7856775/how-to-convert-the-old-emoji-encoding-to-the-latest-encoding-in-ios5
4 MySQL emoji问题
http://dropblood.com/archives/ios-mysql-emoji
5 Emoji 粤语对应表
http://www.iapps.im/wp-content/uploads/2012/02/emoji-pinyin.png?r=010
七 下载资源

1.用户授权接口:获取access_token、openId等;获取并保留用户资料到数据库

adminid
bigint
(20)
DEFAULT
NULL
COMMENT
‘管理员id’
,

emoji图片和编码表
http://download.csdn.net/detail/qdkfriend/4309051

复制代码 代码如下:

type tinyint(4)
DEFAULT
‘1’
COMMENT
‘操作类型:1新增2修改3删除’
,

席卷emoji文件表,emoji数据编码表(Unicode编码,UTF8编码,UTF16编码,SBUnicode编码)

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);
    }
}

tableid
bigint
(20)
DEFAULT
NULL
,

mysql辅助utf8mb4升任方案

2.从微信获取用户资料

tablename
varchar
(255)
COLLATE
utf8_unicode_ci
DEFAULT
NULL
COMMENT
‘表名’
,

[http://mathiasbynens.be/notes/mysql-utf8mb4\#utf8-to-utf8mb4\](
How to support full Unicode in MySQL databases

复制代码 代码如下:

comment
varchar
(255)
COLLATE
utf8_unicode_ci
DEFAULT
NULL
,

)

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

dt datetime
DEFAULT
NULL
,

3.得到用户资料接口

PRIMARY
KEY
(tbid)

public function actionUserinfo()
{
 if(isset($_REQUEST["openid"])){
  $openid = $_REQUEST["openid"];
  $user = WechatUser::find()->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;
}

) ENGINE=InnoDB AUTO_INCREMENT=27
DEFAULT
CHARSET=utf8
COLLATE
=utf8_unicode_ci;

 


三:微信支付

— Table structure for tb_log_content

1.微信开销接口:打包支付多少


复制代码 代码如下:

CREATE
TABLE
tb_log_content (

public function actionPay(){
   
if(isset($_REQUEST[“uid”])&&isset($_REQUEST[“oid”])&&isset($_REQUEST[“totalFee”])){
        //uid、oid、totalFee
        $uid = $_REQUEST[“uid”];
        $oid = $_REQUEST[“oid”];
        $totalFee = $_REQUEST[“totalFee”];
        $timestamp = time();
        //微信支付参数
        $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($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;
}

tbid
bigint
(20)
NOT
NULL
AUTO_INCREMENT,

2.接受微信发送的异步支付结果通报

logid
bigint
(20)
DEFAULT
NULL
,

复制代码 代码如下:

tbkey longtext
COLLATE
utf8_unicode_ci,

public function actionNotify(){
    $postStr = $GLOBALS[“HTTP_RAW_POST_DATA”];
    $postObj = simplexml_load_string($postStr, ‘SimpleXMLElement’,
LIBXML_NOCDATA);
    //
    if ($postObj === false) {
        die(‘parse xml error’);
    }
    if ($postObj->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, $appid, $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
‘<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>’;
    } else {
        //订单状态已履新,直接回到
        return
‘<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>’;
    }
}

tbvalue longtext
COLLATE
utf8_unicode_ci,

3.微信支付类 WechatPay.php

currenttbvalue longtext
COLLATE
utf8_unicode_ci,

复制代码 代码如下:

comment
varchar
(255)
COLLATE
utf8_unicode_ci
DEFAULT
NULL
,

<?php
namespace api\sdk;
use Yii;
class WechatPay
{
    protected $mchid;
    protected $appid;
    protected $key;
    public function __construct($mchid, $appid, $key){
        $this->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($totalFee * 100),
            ‘trade_type’ => ‘JSAPI’,
        );
        $unified[‘sign’] = self::getSign($unified,
$config[‘key’]);
        $responseXml =
self::curlPost(”,
self::arrayToXml($unified));
        $unifiedOrder = simplexml_load_string($responseXml,
‘SimpleXMLElement’, 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, CURLOPT_RETURNTRANSFER, 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, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
//设置cURL允许实施的最长秒数
        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 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 = “<xml>”;
        foreach ($arr as $key => $val){
            if (is_numeric($val)) {
                $xml .= “<” . $key . “>” . $val . “</” . $key .
“>”;
            } else {
                $xml .= “<” . $key . “><![CDATA[” . $val .
“]]></” . $key . “>”;
            }
        }
        $xml .= “</xml>”;
        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, 0, strlen($buff) – 1);
        }
        return $reqPar;
    }
}

PRIMARY
KEY
(tbid)

四:获取JS-SDK的config参数

) ENGINE=InnoDB AUTO_INCREMENT=109
DEFAULT
CHARSET=utf8
COLLATE
=utf8_unicode_ci;

按照微信公众平台开发者文档:

负有须求选取JS-SDK的页面必须先注入配置音信,否则将不可能调用(同一个url仅需调用三次,对于变化url的SPA的web
app可在每一趟url变化时开展调用,近来Android微信客户端不协助pushState的H5新特点,所以采纳pushState来兑现web
app的页面会造成签名败北,此题材会在Android6.2中修复)。

即:

复制代码 代码如下:

wx.config({
    debug: true, //
开启调试格局,调用的有着api的回来值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数音信会通过log打出,仅在pc端时才会打印。
    appId: ”, // 必填,公众号的唯一标识
    timestamp: , // 必填,生成签名的大运戳
    nonceStr: ”, // 必填,生成签名的随机串
    signature: ”,// 必填,签名,见附录1
    jsApiList: [] //
必填,要求采纳的JS接口列表,所有JS接口列表见附录2
});

1.微信支付类 WechatPay.php

复制代码 代码如下:

<?php
namespace api\sdk;
use Yii;
class WechatPay
{
    public function getSignPackage($url) {
        $jsapiTicket = self::getJsApiTicket();
        $timestamp = time();
        $nonceStr = self::createNonceStr();
        // 那里参数的一一要坚守 key 值 ASCII 码升序排序
        $string =
“jsapi_ticket=”.$jsapiTicket.”&noncestr=”.$nonceStr.”&timestamp=”.$timestamp.”&url=”.$url;
        $signature = sha1($string);
        $signPackage = array(
            “appId”     => $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 = ”, $options = array()){
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 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, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
//设置cURL允许实施的最长秒数
        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 createNonceStr($length = 16){
        $chars =
‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789’;
        $str = ”;
        for ($i = 0; $i<$length; $i++){
            $str .= substr($chars, mt_rand(0, strlen($chars) – 1),
1);
        }
        return $str;
    }
}

2.拿走config参数接口

public function actionConfig(){
 if (isset($_REQUEST['url'])) {
 $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($mchid, $appid, $key);
 $package = $wx_pay->getSignPackage($url);
 $result['error'] = 0;
 $result['msg'] = '获取成功';
 $result['config'] = $package;
 } else {
 $result['error'] = 1;
 $result['msg'] = '参数错误';
 }
 return $result;
}

以上就是利用Yii2微信后台开发总体历程及示范代码,希望本文对我们基于php的微信公众平台开发具有协助。

你或许感兴趣的篇章:

  • Yii2
    RESTful中api的利用及开发实例详解
  • Yii2中设置与收获别名的函数(setAlias和getAlias)用法分析
  • Yii2中YiiBase自动加载类、引用文件格局分析(autoload)
  • Yii2创造控制器(createController)方法详解
  • Yii2宗旨(Theme)用法详解
  • Yii2创立表单(ActiveForm)方法详解
  • Yii2验证器(Validator)用法分析
  • yii2
    RBAC使用DbManager已毕后台权限判断的点子
  • Yii2不难达成多语言配置的法门
  • yii2控制器Controller
    Ajax操作示例
  • Yii2中Restful
    API原理实例分析

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图