微信第三方开放平台上传审核小程序

时间:2024-05-31 22:29:40

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

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

微信第三方开放平台上传审核小程序

微信第三方开放平台上传审核小程序

微信第三方开放平台上传审核小程序

微信第三方开放平台上传审核小程序

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

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

<?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= '[email protected]**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

<?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= '[email protected]**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;

                if (Db::name("weixin_account")->where(array("type" => 1))->update(array("component_verify_ticket" => $component_verify_ticket, "date_time" => time()))) {

                    $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

<?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 = "魔盒CMS小程序模板库")

    {

        $ext_json = json_encode('{"extEnable": true,"extAppid": "wx572****bfb","ext":{"appid": "'.$this->authorizer_appid.'"}}');

        $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 = "魔盒CMS 微信投票 微网站 微信商城" ,$title = "魔盒CMS微信公众号营销小程序开发")

    {

        $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

<?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

25

26

27

28

29

30

31

32

33

34

35

-- Adminer 4.6.2 MySQL dump

 

SET NAMES utf8;

SET time_zone = '+00:00';

SET foreign_key_checks = 0;

SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';

 

DROP TABLE IF EXISTS `wxminiprograms`;

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='微信小程序授权列表';

 

 

-- 2018-07-25 09:32:49

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

-- Adminer 4.6.2 MySQL dump

 

SET NAMES utf8;

SET time_zone = '+00:00';

SET foreign_key_checks = 0;

SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';

 

DROP TABLE IF EXISTS `wxminiprogram_audit`;

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='微信小程序提交审核的小程序';

 

 

-- 2018-07-25 09:35:07

微信第三方开放平台上传审核小程序

微信第三方开放平台上传审核小程序