【亚洲必赢官网】全盘应用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

【亚洲必赢官网】全盘应用Yii2微信后台开发的不可计数计算,浅谈管理种类操作日志设计。率先步:请求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微信后台开发的层层了,给急需的伙伴们参考。

治本连串的操作日志咋做成通用的模块一向是个让自己头疼的问题,然而看了搜狐里的某篇文章后,现在着力化解了。
  相关小说链接:《系统操作日志设计》
  在上马做事先,必须把七个日志分清楚,那就是一般而言操作日志作业操作日志,那两者有什么差异?
  在自己晓得,普通操作日志就是单表的操作记录,而事情操作日志则就是一密密麻麻的平常操作日志的汇集。
  打个如果,用户必要购置同一宝贝,已经到了下单那步,下单就是个事情,那么些事情背后就是一层层的工作,如:
  生成订单 → 生成商品快照 → 发送一条站内信 → 删除购物车里对应宝贝
  那样一个下单操作就包蕴了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地图