這2天接觸了微信服務(wù)號(hào)的開發(fā), 分享一下我的小技巧
存在問題
由于需要和微信服務(wù)器進(jìn)行主動(dòng)和被動(dòng)通信. 在做微信開發(fā)進(jìn)行調(diào)試時(shí)會(huì)比較麻煩
- access token, 的獲取需要到微信后臺(tái)添加服務(wù)器ip白名單, 不在白名單中ip 無法獲取, 而本地開發(fā)端的ip經(jīng)常變化, 且添加ip到白名單還需要驚動(dòng)公眾號(hào)管理員
- 微信需要主動(dòng)推消息給我們后臺(tái)配的服務(wù)器地址, 而本地網(wǎng)絡(luò)端通常不能被公網(wǎng)中其他端, 直接訪問到.
- 開發(fā)中有時(shí)需要給其他人測(cè)試, 又是公網(wǎng)問題
解決方法
由于以上問題的存在, 很多人直接選擇在服務(wù)器端調(diào)試. 不過這真的很煩, 每次改動(dòng)都要上傳. 首先去申請(qǐng)個(gè)測(cè)試公眾號(hào), 當(dāng)然, 如果你開發(fā)的公眾號(hào)還沒開始運(yùn)營(yíng),也可以不申請(qǐng).
- 把本地端口暴露到公網(wǎng), 且綁定一個(gè)固定公網(wǎng)ip
在開發(fā)端執(zhí)行(如果是win下, putty也有建立隧道的方法,請(qǐng)自行百度之)
ssh -N -v -R 3000:127.0.0.1:80 root@app.dev.peterq.cn
app.dev.peterq.cn 是我的一臺(tái)擁有公網(wǎng)ip的服務(wù)器
這個(gè)命令會(huì)讓app.dev.peterq.cn監(jiān)聽127.0.0.1:3000, 并把所有數(shù)據(jù)傳給本機(jī)ssh, shh再把數(shù)據(jù)轉(zhuǎn)發(fā)到127.0.0.1:80(這里可以是任何你電腦能訪問的ip和端口)
由于app.dev.peterq.cn監(jiān)聽的是它的本地端口, 外網(wǎng)還是訪問不到這個(gè)代理端口的. 我們借助nginx(其他服務(wù)器軟件也行啦)實(shí)現(xiàn),新增nginx虛擬主機(jī):
server {
listen 80;
listen [::]:80;
server_name app.dev.peterq.cn;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host:80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Via "nginx";
}
}
這樣就能通過 http://app.dev.peterq.cn 直接訪問到你本地開發(fā)的項(xiàng)目啦,而且不影響你服務(wù)器原有web應(yīng)用, 你可以在微信后臺(tái)把相關(guān)配置填寫app.dev.peterq.cn這個(gè)域名的了, 微信將能正常的主動(dòng)向你的開發(fā)端發(fā)起通信
- 解決獲取access_token的ip限制. 由于本地開發(fā)端的公網(wǎng)ip時(shí)常變動(dòng), 而添加ip至白名單又不方便, 所以我們把a(bǔ)pp.dev.peterq.cn的服務(wù)器ip地址加入白名單并讓其代理獲取.
app.dev.peterq.cn 這里可以寫個(gè)腳本(這個(gè)腳本你就不要在轉(zhuǎn)發(fā)到3000端口啦, 不然數(shù)據(jù)轉(zhuǎn)一圈又回來了)例如:
<?php
$_GET['secret'] === 'your_secret' or die('access denied');
echo file_get_contents('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET');
然后本地端, 如果你使用easy wechat 包的話, 可以這樣設(shè)置
$wechat = new \EasyWeChat\Foundation\Application($options);
$wechat->access_token->setToken(json_decode(file_get_contents('http://app.dev.peterq.cn/token.php?secret=your_secret'))->access_token);
- 同一份代碼區(qū)分開發(fā)環(huán)境和線上環(huán)境.
上面代理獲取token是在開發(fā)環(huán)境下, 線上是不需要代理獲取的, 那么怎么在用同一份代碼的情況下區(qū)分呢. 可以用不同的配置文件. 而我是這樣解決的:
在開發(fā)端的nginx配置添加:
location ~ \.php$ {
fastcgi_param APP_DEV_MODE true;
}
修改上述提到的代碼:
$wechat = new \EasyWeChat\Foundation\Application($options);
isset($_SERVER['APP_DEV_MODE']) and $wechat->access_token->setToken(json_decode(file_get_contents('http://app.dev.peterq.cn/token.php?secret=your_secret'))->access_token);
The end!
歡迎閱讀及投稿: laravel5.5框架解析 (ps: 最近太忙, 好多天沒更新了)