微信小程序 第三方平台授权小程序业务

image

第一步:申请微信开放平台帐号并创建第三方平台

image.png

image.png

image.png

image.png

第二步:公众号/小程序授权给第三方平台

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<?php

// 微信第三方平台授权流程
namespace app\home\controller;
class Weixin extends Common{

private $appid = 'wx3e******165c';
//第三方平台应用appid

private $appsecret = '13e**********d039';
//第三方平台应用appsecret

private $token = 'ePF58******Q2Ae';
//第三方平台应用token(消息校验Token)

private $encodingAesKey = 'bzH***FCamD';
//第三方平台应用Key(消息加解密Key)

private $component_ticket= 'ticket@**xv-g';
//微信后台推送的ticket,用于获取第三方平台接口调用凭据

/*
* 扫码授权,注意此URL必须放置在页面当中用户点击进行跳转,
* 不能通过程序跳转,否则将出现“请确认授权入口页所在域名,
* 与授权后回调页所在域名相同....”错误
* @params string $redirect_uri : 扫码成功后的回调地址
* @params int $auth_type : 授权类型,1公众号,2小程序,
* 3公众号/小程序同时展现。不传参数默认都展示
*/
public function startAuth($redirect_uri,$auth_type = 3){
$url = "https://mp.weixin.qq.com/cgi-bin/componentloginpage
?component_appid=".$this->appid."
&pre_auth_code=".$this->get_pre_auth_code()."
&redirect_uri=".urlencode($redirect_uri)."
&auth_type=".$auth_type;
return $url;
}

/*
* 获取第三方平台access_token
* 注意,此值应保存,代码这里没保存
*/
private function get_component_access_token(){
$url = "https://api.weixin.qq.com/cgi-bin/component/api_component_token";
$data = '{
"component_appid":"'.$this->appid.'" ,
"component_appsecret": "'.$this->appsecret.'",
"component_verify_ticket": "'.$this->component_ticket.'"
}';
$ret = json_decode($this->https_post($url,$data));
if($ret->errcode == 0) {
return $ret->component_access_token;
} else {
return $ret->errcode;
}
}

/*
* 第三方平台方获取预授权码pre_auth_code
*/
private function get_pre_auth_code(){
$url = "https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode
?component_access_token=".$this->get_component_access_token();
$data = '{"component_appid":"'.$this->appid.'"}';
$ret = json_decode($this->https_post($url,$data));
if($ret->errcode == 0) {
return $ret->pre_auth_code;
} else {
return $ret->errcode;
}
}

/*
* 发起POST网络提交
* @params string $url : 网络地址
* @params json $data : 发送的json格式数据
*/
private function https_post($url,$data){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
if (!empty($data)){
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}

/*
* 发起GET网络提交
* @params string $url : 网络地址
*/
private function https_get($url){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_HEADER, FALSE) ;
curl_setopt($curl, CURLOPT_TIMEOUT,60);
if (curl_errno($curl)) {
return 'Errno'.curl_error($curl);
}else{
$result = curl_exec($curl);
}
curl_close($curl);
return $result;
}
}
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<?php

/*
* 接收微信官方推送的ticket值以及取消授权等操作
*/
namespace app\home\controller;
use think\Db;
class Openoauth extends Common{

private $appid = 'wx3e******165c';
//第三方平台应用appid

private $appsecret = '13e**********d039';
//第三方平台应用appsecret

private $token = 'ePF58******Q2Ae';
//第三方平台应用token(消息校验Token)

private $encodingAesKey = 'bzH***FCamD';
//第三方平台应用Key(消息加解密Key)

private $component_ticket= 'ticket@**xv-g';
//微信后台推送的ticket,用于获取第三方平台接口调用凭据

/*
* 接收微信官方推送的消息(每10分钟1次)
* 这里需要引入微信官方提供的加解密码示例包
* 官方文档:https://open.weixin.qq.com/cgi-bin/showdocument
* ?action=dir_list&t=resource/res_list&verify=1&id=open1419318479&token=&lang=zh_CN
* 示例包下载:https://wximg.gtimg.com/shake_tv/mpwiki/cryptoDemo.zip
*/
public function index(){
$encryptMsg = file_get_contents("php://input");
$xml_tree = new \DOMDocument();
$xml_tree->loadXML($encryptMsg);
$xml_array = $xml_tree->getElementsByTagName("Encrypt");
$encrypt = $xml_array->item(0)->nodeValue;
require_once('wxBizMsgCrypt.php');
$Prpcrypt = new \Prpcrypt($this->encodingAesKey);
$postData = $Prpcrypt->decrypt($encrypt, $this->appid);
if ($postData[0] != 0) {
return $postData[0];
} else {
$msg = $postData[1];
$xml = new \DOMDocument();
$xml->loadXML($msg);
$array_a = $xml->getElementsByTagName("InfoType");
$infoType = $array_a->item(0)->nodeValue;
if ($infoType == "unauthorized") {
//取消公众号/小程序授权
$array_b = $xml->getElementsByTagName("AuthorizerAppid");
$AuthorizerAppid = $array_b->item(0)->nodeValue;
//公众号/小程序appid
$where = array("type" => 1, "appid" => $AuthorizerAppid);
$save = array(
"authorizer_access_token" => "",
"authorizer_refresh_token" => "",
"authorizer_expires" => 0
);
Db::name("wxuser")->where($where)->update($save);
//公众号取消授权
Db::name("wxminiprograms")
->where('authorizer_appid',$AuthorizerAppid)
->update($save);
//小程序取消授权
} else if ($infoType == "component_verify_ticket") {
//微信官方推送的ticket值
$array_e = $xml->getElementsByTagName("ComponentVerifyTicket");
$component_verify_ticket = $array_e->item(0)->nodeValue;
$result = Db::name("weixin_account")
->where(array("type" => 1))
->update(
array(
"component_verify_ticket" => $component_verify_ticket,
"date_time" => time()
)
);
if ($result) {
$this->updateAccessToken($component_verify_ticket);
echo "success";
}
}
}
}

/*
* 更新component_access_token
* @params string $component_verify_ticket
* */
private function updateAccessToken($component_verify_ticket){
$weixin_account = Db::name('weixin_account')
->where(['type'=>1])
->field('id,appId,appSecret,component_access_token,token_expires')
->find();
if($weixin_account['token_expires'] <= time() ) {
$apiUrl = 'https://api.weixin.qq.com/cgi-bin/component/api_component_token';
$data = '{
"component_appid":"'.$weixin_account['appId'].'" ,
"component_appsecret": "'.$weixin_account['appSecret'].'",
"component_verify_ticket": "'.$component_verify_ticket.'"
}';
$json = json_decode(_request($apiUrl,$data));
if(isset($json->component_access_token)) {
Db::name('weixin_account')
->where(['id'=>$weixin_account['id']])
->update(
[
'component_access_token'=>$json->component_access_token,
'token_expires'=>time()+7200
]
);
}
}
}
}
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
<?php

/*
* 代小程序实现业务
*/
namespace app\home\model;
use think\Model;
use think\Db;
use think\Cache;
class Miniprogram extends Model{

private $thirdAppId;
//开放平台appid

private $encodingAesKey;
//开放平台encodingAesKey

private $thirdToken;
//开放平台token

private $thirdAccessToken;
//开放平台access_token

private $authorizer_appid;

private $authorizer_access_token;

private $authorizer_refresh_token;

public function __construct($appid){
$weixin_account = Db::name('weixin_account')
->where(['type' => 1])
->field('token,encodingAesKey,appId,component_access_token')
->find();
if ($weixin_account) {
$this->thirdAppId = $weixin_account['appId'];
$this->encodingAesKey = $weixin_account['encodingAesKey'];
$this->thirdToken = $weixin_account['token'];
$this->thirdAccessToken = $weixin_account['component_access_token'];
$miniprogram = Db::name('wxminiprograms')
->where('authorizer_appid',$appid)
->field('authorizer_access_token,authorizer_refresh_token,authorizer_expires')
->find();
if($miniprogram){
$this->authorizer_appid = $appid;
if(time() > $miniprogram['authorizer_expires']){
$miniapp = $this->update_authorizer_access_token($appid,$miniprogram['authorizer_refresh_token']);
if($miniapp) {
$this->authorizer_access_token = $miniapp->authorizer_access_token;
$this->authorizer_refresh_token = $miniapp->authorizer_refresh_token;
} else {
$this->errorLog("更新小程序access_token失败,appid:".$this->authorizer_appid,'');
exit;
}
} else {
$this->authorizer_access_token = $miniprogram['authorizer_access_token'];
$this->authorizer_refresh_token = $miniprogram['authorizer_refresh_token'];
}
} else {
$this->errorLog("小程序不存在,appid:".$this->authorizer_appid,'');
exit;
}
} else {
$this->errorLog("请增加微信第三方公众号平台账户信息",'');
exit;
}
}

/*
* 设置小程序服务器地址,无需加https前缀,但域名必须可以通过https访问
* @params string / array $domains : 域名地址。只接收一维数组。
* */
public function setServerDomain($domain = 'test.moh.cc'){
$url = "https://api.weixin.qq.com/wxa/modify_domain
?access_token=".$this->authorizer_access_token;
if(is_array($domain)) {
$https = ''; $wss = '';
foreach ($domain as $key => $value) {
$https .= '"https://'.$value.'",';
$wss .= '"wss://'.$value.'",';
}
$https = rtrim($https,',');
$wss = rtrim($wss,',');
$data = '{
"action":"add",
"requestdomain":['.$https.'],
"wsrequestdomain":['.$wss.'],
"uploaddomain":['.$https.'],
"downloaddomain":['.$https.']
}';
} else {
$data = '{
"action":"add",
"requestdomain":"https://'.$domain.'",
"wsrequestdomain":"wss://'.$domain.'",
"uploaddomain":"https://'.$domain.'",
"downloaddomain":"https://'.$domain.'"
}';
}
$ret = json_decode(https_post($url,$data));
if($ret->errcode == 0) {
return true;
} else {
$this->errorLog("设置小程序服务器地址失败,appid:".$this->authorizer_appid,$ret);
return false;
}
}

/*
* 设置小程序业务域名,无需加https前缀,但域名必须可以通过https访问
* @params string / array $domains : 域名地址。只接收一维数组。
* */
public function setBusinessDomain($domain = 'test.moh.cc'){
$url = "https://api.weixin.qq.com/wxa/setwebviewdomain
?access_token=".$this->authorizer_access_token;
if(is_array($domain)) {
$https = '';
foreach ($domain as $key => $value) {
$https .= '"https://'.$value.'",';
}
$https = rtrim($https,',');
$data = '{
"action":"add",
"webviewdomain":['.$https.']
}';
} else {
$data = '{
"action":"add",
"webviewdomain":"https://'.$domain.'"
}';
}
$ret = json_decode(https_post($url,$data));
if($ret->errcode == 0) {
return true;
} else {
$this->errorLog("设置小程序业务域名失败,appid:".$this->authorizer_appid,$ret);
return false;
}
}

/*
* 成员管理,绑定小程序体验者
* @params string $wechatid : 体验者的微信号
* */
public function bindMember($wechatid){
$url = "https://api.weixin.qq.com/wxa/bind_tester
?access_token=".$this->authorizer_access_token;
$data = '{"wechatid":"'.$wechatid.'"}';
$ret = json_decode(https_post($url,$data));
if($ret->errcode == 0) {
return true;
} else {
$this->errorLog("绑定小程序体验者操作失败,appid:".$this->authorizer_appid,$ret);
return false;
}
}

/*
* 成员管理,解绑定小程序体验者
* @params string $wechatid : 体验者的微信号
* */
public function unBindMember($wechatid){
$url = "https://api.weixin.qq.com/wxa/unbind_tester
?access_token=".$this->authorizer_access_token;
$data = '{"wechatid":"'.$wechatid.'"}';
$ret = json_decode(https_post($url,$data));
if($ret->errcode == 0) {
return true;
} else {
$this->errorLog("解绑定小程序体验者操作失败,appid:".$this->authorizer_appid,$ret);
return false;
}
}

/*
* 成员管理,获取小程序体验者列表
* */
public function listMember(){
$url = "https://api.weixin.qq.com/wxa/memberauth
?access_token=".$this->authorizer_access_token;
$data = '{"action":"get_experiencer"}';
$ret = json_decode(https_post($url,$data));
if($ret->errcode == 0) {
return $ret->members;
} else {
$this->errorLog("获取小程序体验者列表操作失败,appid:".$this->authorizer_appid,$ret);
return false;
}
}

/*
* 为授权的小程序帐号上传小程序代码
* @params int $template_id : 模板ID
* @params json $ext_json : 小程序配置文件,json格式
* @params string $user_version : 代码版本号
* @params string $user_desc : 代码描述
* */
public function uploadCode($template_id = 1, $user_version = 'v1.0.0', $user_desc = "小程序"){
$ext_str = '{
"extEnable": true,
"extAppid": "wx572****bfb",
"ext":{"appid": "'.$this->authorizer_appid.'"}
}';
$ext_json = json_encode($ext_str);
$url = "https://api.weixin.qq.com/wxa/commit
?access_token=".$this->authorizer_access_token;
$data = '{
"template_id":"'.$template_id.'",
"ext_json":'.$ext_json.',
"user_version":"'.$user_version.'",
"user_desc":"'.$user_desc.'"
}';
$ret = json_decode(https_post($url,$data));
if($ret->errcode == 0) {
return true;
} else {
$this->errorLog("为授权的小程序帐号上传小程序代码操作失败,appid:".$this->authorizer_appid,$ret);
return false;
}
}

/*
* 获取体验小程序的体验二维码
* @params string $path : 指定体验版二维码跳转到某个具体页面
* */
public function getExpVersion($path = ''){
if($path){
$url = "https://api.weixin.qq.com/wxa/get_qrcode
?access_token=".$this->authorizer_access_token."&path=".urlencode($path);
} else {
$url = "https://api.weixin.qq.com/wxa/get_qrcode
?access_token=".$this->authorizer_access_token;
}
$ret = json_decode(https_get($url));
if($ret->errcode) {
$this->errorLog("获取体验小程序的体验二维码操作失败,appid:".$this->authorizer_appid,$ret);
return false;
} else {
return $url;
}
}

/*
* 提交审核
* @params string $tag : 小程序标签,多个标签以空格分开
* @params strint $title : 小程序页面标题,长度不超过32
* */
public function submitReview($tag = "礼品" ,$title = "行业社交"){
$first_class = '';$second_class = '';$first_id = 0;$second_id = 0;
$address = "pages/index/index";
$category = $this->getCategory();
if(!empty($category)) {
$first_class = $category[0]->first_class ? $category[0]->first_class : '' ;
$second_class = $category[0]->second_class ? $category[0]->second_class : '';
$first_id = $category[0]->first_id ? $category[0]->first_id : 0;
$second_id = $category[0]->second_id ? $category[0]->second_id : 0;
}
$getpage = $this->getPage();
if(!empty($getpage) && isset($getpage[0])) {
$address = $getpage[0];
}
$url = "https://api.weixin.qq.com/wxa/submit_audit
?access_token=".$this->authorizer_access_token;
$data = '{
"item_list":[{
"address":"'.$address.'",
"tag":"'.$tag.'",
"title":"'.$title.'",
"first_class":"'.$first_class.'",
"second_class":"'.$second_class.'",
"first_id":"'.$first_id.'",
"second_id":"'.$second_id.'"
}]
}';
$ret = json_decode(https_post($url,$data));
if($ret->errcode == 0) {
Db::name('wxminiprogram_audit')->insert([
'appid'=>$this->authorizer_appid,
'auditid'=>$ret->auditid,
'create_time'=>date('Y-m-d H:i:s')
]);
return true;
} else {
$this->errorLog("小程序提交审核操作失败,appid:".$this->authorizer_appid,$ret);
return false;
}
}

/*
* 小程序审核撤回
* 单个帐号每天审核撤回次数最多不超过1次,一个月不超过10次。
* */
public function unDoCodeAudit(){
$url = "https://api.weixin.qq.com/wxa/undocodeaudit
?access_token=".$this->authorizer_access_token;
$ret = json_decode(https_get($url));
if($ret->errcode == 0) {
return true;
} else {
$this->errorLog("小程序审核撤回操作失败,appid:".$this->authorizer_appid,$ret);
return false;
}
}

/*
* 查询指定版本的审核状态
* @params string $auditid : 提交审核时获得的审核id
* */
public function getAuditStatus($auditid){
$url = "https://api.weixin.qq.com/wxa/get_auditstatus
?access_token=".$this->authorizer_access_token;
$data = '{"auditid":"'.$auditid.'"}';
$ret = json_decode(https_post($url,$data));
if($ret->errcode == 0) {
$reason = $ret->reason ? $ret->reason : '';
Db::name('wxminiprogram_audit')
->where(['appid'=>$this->authorizer_appid,'auditid'=>$auditid])
->update([
'status'=>$ret->status,
'reason'=>$reason
]);
return true;
} else {
$this->errorLog("查询指定版本的审核状态操作失败,appid:".$this->authorizer_appid,$ret);
return false;
}
}

/*
* 查询最新一次提交的审核状态
* */
public function getLastAudit(){
$url = "https://api.weixin.qq.com/wxa/get_latest_auditstatus
?access_token=".$this->authorizer_access_token;
$ret = json_decode(https_get($url));
if($ret->errcode == 0) {
$reason = $ret->reason ? $ret->reason : '';
Db::name('wxminiprogram_audit')
->where(['appid'=>$this->authorizer_appid,'auditid'=>$ret->auditid])
->update([
'status'=>$ret->status,
'reason'=>$reason
]);
return $ret->auditid;
} else {
$this->errorLog("查询最新一次提交的审核状态操作失败,appid:".$this->authorizer_appid,$ret);
return false;
}
}

/*
* 发布已通过审核的小程序
* */
public function release(){
$url = "https://api.weixin.qq.com/wxa/release
?access_token=".$this->authorizer_access_token;
$data = '{}';
$ret = json_decode(https_post($url,$data));
if($ret->errcode == 0) {
return true;
} else {
$this->errorLog("发布已通过审核的小程序操作失败,appid:".$this->authorizer_appid,$ret);
return $ret->errcode;
}
}

/*
* 获取授权小程序帐号的可选类目
* */
private function getCategory(){
$url = "https://api.weixin.qq.com/wxa/get_category
?access_token=".$this->authorizer_access_token;
$ret = json_decode(https_get($url));
if($ret->errcode == 0) {
return $ret->category_list;
} else {
$this->errorLog("获取授权小程序帐号的可选类目操作失败,appid:".$this->authorizer_appid,$ret);
return false;
}
}

/*
* 获取小程序的第三方提交代码的页面配置
* */
private function getPage(){
$url = "https://api.weixin.qq.com/wxa/get_page
?access_token=".$this->authorizer_access_token;
$ret = json_decode(https_get($url));
if($ret->errcode == 0) {
return $ret->page_list;
} else {
$this->errorLog("获取小程序的第三方提交代码的页面配置失败,appid:".$this->authorizer_appid,$ret);
return false;
}
}

/*
* 更新授权小程序的authorizer_access_token
* @params string $appid : 小程序appid
* @params string $refresh_token : 小程序authorizer_refresh_token
* */
private function update_authorizer_access_token($appid,$refresh_token){
$url = 'https://api.weixin.qq.com/cgi-bin/component/api_authorizer_token
?component_access_token=' . $this->thirdAccessToken;
$data = '{
"component_appid":"' . $this->thirdAppId . '",
"authorizer_appid":"' . $appid . '",
"authorizer_refresh_token":"' . $refresh_token . '"
}';
$ret = json_decode(https_post($url, $data));
if (isset($ret->authorizer_access_token)) {
Db::name('wxminiprograms')
->where(['authorizer_appid' => $appid])
->update(
[
'authorizer_access_token' => $ret->authorizer_access_token,
'authorizer_expires' => (time() + 7200),
'authorizer_refresh_token' => $ret->authorizer_refresh_token
]
);
return $ret;
} else {
$this->errorLog("更新授权小程序的authorizer_access_token操作失败,appid:".$appid,$ret);
return null;
}
}

private function errorLog($msg,$ret){
file_put_contents(ROOT_PATH . 'runtime/error/miniprogram.log', "[" . date('Y-m-d H:i:s') . "] ".$msg."," .json_encode($ret).PHP_EOL, FILE_APPEND);
}

}
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<?php

//代小程序实现业务示例包
namespace app\user\controller;
use app\home\model\Miniprogram;
use think\Db;
class Wxminiprogram extends Pub{

public $appid = 'wx57****1bfb';
//需要实现业务小程序appid

public function index(){
return view();
}

public function doAction(){
if(request()->isPost()) {
$action = input('action');
$mini = new Miniprogram($this->appid);
if($action == 'auth') {
//小程序授权
echo '<script>alert("已授权");history.back();</script>';
} elseif($action == 'setServerDomain') {
//设置小程序服务器域名地址
if($mini->setServerDomain()){
echo '<script>alert("设置小程序服务器域名操作成功");history.back();</script>';
} else {
echo '<script>alert("设置小程序服务器域名操作失败或已设置,请查看日志");history.back();</script>';
}
} elseif($action == 'setBusinessDomain') {
//设置业务域名
if($mini->setBusinessDomain()){
echo '<script>alert("设置小程序业务域名操作成功");history.back();</script>';
} else {
echo '<script>alert("设置小程序业务域名操作失败或已设置,请查看日志");history.back();</script>';
}
} elseif($action == 'bind') {
//绑定小程序体验者
$wechatid = input('wechatid');
if($wechatid) {
if($mini->bindMember($wechatid)){
echo '<script>alert("绑定小程序体验者操作成功");history.back();</script>';
} else {
echo '<script>alert("绑定小程序体验者操作失败,请查看日志");history.back();</script>';
}
} else {
echo '<script>alert("请输入微信号");history.back();</script>';
}
} elseif($action == 'uploadCode') {
//上传小程序代码
if($mini->uploadCode(2)){
echo '<script>alert("上传小程序代码操作成功");history.back();</script>';
} else {
echo '<script>alert("上传小程序代码操作失败,请查看日志");history.back();</script>';
}
} elseif($action == 'getExpVersion') {
//获取体验小程序的体验二维码
$qrcode = $mini->getExpVersion();
if($qrcode){
echo '<script>window.location.href="'.$qrcode.'";</script>';
} else {
echo '<script>alert("获取体验小程序的体验二维码操作失败");history.back();</script>';
}
} elseif($action == 'review') {
//提交审核
$auditid = Db::name('wxminiprogram_audit')
->where(['appid'=>$this->appid,'status'=>['neq',0]])
->order('create_time','desc')
->value('auditid');
if($auditid){
echo '<script>alert("有待处理的版本,请先处理该版本相关事项再提交新的审核。审核ID:'.$auditid.'");history.back();</script>';
} else {
if($mini->submitReview()){
echo '<script>alert("小程序提交审核操作成功");history.back();</script>';
} else {
echo '<script>alert("小程序提交审核操作失败,请查看日志");history.back();</script>';
}
}
} elseif($action == 'getAudit') {
//查询指定版本的审核状态
$auditid = input('auditid');
if($auditid) {
if($mini->getAuditStatus($auditid)){
$audit = Db::name('wxminiprogram_audit')
->where(['appid'=>$this->appid,'auditid'=>$auditid])
->field('status,reason')->find();
if($audit['status'] == 0) {
echo '<script>alert("该版本审核已通过");history.back();</script>';
} elseif($audit['status'] == 1) {
echo '<script>alert("该版本审核失败,原因:'.$audit['reason'].'");history.back();</script>';
} elseif($audit['status'] == 2) {
echo '<script>alert("该版本小程序正在审核中......");history.back();</script>';
} else {
echo '<script>alert("未知状态......");history.back();</script>';
}
} else {
echo '<script>alert("查询指定版本的审核状态操作失败,请查看日志");history.back();</script>';
}
} else {
echo '<script>alert("请输入要查询的审核ID");history.back();</script>';
}

} elseif($action == 'lastAudit') {
//查询最新一次提交的审核状态
$auditid = $mini->getLastAudit();
if($auditid){
$audit = Db::name('wxminiprogram_audit')
->where(['appid'=>$this->appid,'auditid'=>$auditid])
->field('status,reason')->find();
if($audit['status'] == 0) {
echo '<script>alert("审核已通过");history.back();</script>';
} elseif($audit['status'] == 1) {
echo '<script>alert("审核失败,原因:'.$audit['reason'].'");history.back();</script>';
} elseif($audit['status'] == 2) {
echo '<script>alert("小程序正在审核中......");history.back();</script>';
} else {
echo '<script>alert("未知状态......");history.back();</script>';
}
}else {
echo '<script>alert("查询最新一次提交的审核状态操作失败,请查看日志");history.back();</script>';
}
} elseif($action == 'release') {
//发布已通过审核的小程序
$auditid = Db::name('wxminiprogram_audit')
->where(['appid'=>$this->appid,'status'=>['neq',0]])
->order('create_time','desc')
->value('auditid');
if($auditid){
echo '<script>alert("有待处理的版本,请先处理该版本相关事项再发布版本。审核ID:'.$auditid.'");history.back();</script>';
} else {
$errcode = $mini->release();
if($errcode){
echo '<script>alert("已发版");history.back();</script>';
} else {
echo '<script>alert("发版失败,错误代码:'.$errcode.'");history.back();</script>';
}
}
}
}
}
}

wxminiprograms数据表,保存已授权小程序的基本信息及授权相关信息
(authorizer_access_token/authorizer_refresh_token)这两个值很重要,代小程序实现业务基本上是通过这两个值来实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE TABLE `wxminiprograms` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`uid` int(10) unsigned NOT NULL COMMENT '用户ID',
`nick_name` varchar(45) DEFAULT NULL COMMENT '微信小程序名称',
`alias` varchar(45) DEFAULT NULL COMMENT '别名',
`token` varchar(45) DEFAULT NULL COMMENT '平台生成的token值',
`head_img` varchar(255) DEFAULT NULL COMMENT '微信小程序头像',
`verify_type_info` tinyint(1) DEFAULT NULL COMMENT '授权方认证类型,-1代表未认证,0代表微信认证',
`is_show` tinyint(1) DEFAULT '0' COMMENT '是否显示,0显示,1隐藏',
`user_name` varchar(45) DEFAULT NULL COMMENT '原始ID',
`qrcode_url` varchar(255) DEFAULT NULL COMMENT '二维码图片的URL',
`business_info` varchar(255) DEFAULT NULL COMMENT 'json格式。用以了解以下功能的开通状况(0代表未开通,1代表已开通): open_store:是否开通微信门店功能 open_scan:是否开通微信扫商品功能 open_pay:是否开通微信支付功能 open_card:是否开通微信卡券功能 open_shake:是否开通微信摇一摇功能',
`idc` int(10) unsigned DEFAULT NULL COMMENT 'idc',
`principal_name` varchar(45) DEFAULT NULL COMMENT '小程序的主体名称',
`signature` varchar(255) DEFAULT NULL COMMENT '帐号介绍',
`miniprograminfo` varchar(255) DEFAULT NULL COMMENT 'json格式。判断是否为小程序类型授权,包含network小程序已设置的各个服务器域名',
`func_info` longtext COMMENT 'json格式。权限集列表,ID为17到19时分别代表: 17.帐号管理权限 18.开发管理权限 19.客服消息管理权限 请注意: 1)该字段的返回不会考虑小程序是否具备该权限集的权限(因为可能部分具备)。',
`authorizer_appid` varchar(45) DEFAULT NULL COMMENT '小程序appid',
`authorizer_access_token` varchar(255) DEFAULT NULL COMMENT '授权方接口调用凭据(在授权的公众号或小程序具备API权限时,才有此返回值),也简称为令牌',
`authorizer_expires` int(10) unsigned DEFAULT NULL COMMENT 'refresh有效期',
`authorizer_refresh_token` varchar(255) DEFAULT NULL COMMENT '接口调用凭据刷新令牌',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '授权时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='微信小程序授权列表'

wxminiprogram_audit数据表,保存提交审核的小程序

1
2
3
4
5
6
7
8
9
CREATE TABLE `wxminiprogram_audit` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`appid` varchar(45) NOT NULL COMMENT '小程序appid',
`auditid` varchar(45) NOT NULL COMMENT '审核编号',
`status` tinyint(1) unsigned NOT NULL DEFAULT '3' COMMENT '审核状态,其中0为审核成功,1为审核失败,2为审核中,3已提交审核',
`reason` varchar(255) DEFAULT NULL COMMENT '当status=1,审核被拒绝时,返回的拒绝原因',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '提交审核时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='微信小程序提交审核的小程序'

image.png

image.png

转载http://www.php.cn/weixin-kaifa-406993.html

-------------本文结束感谢您的阅读-------------
0%