ä¸ã微信å°ç¨åºåç«¯ææ¯éåââ为ä»ä¹éPHPï¼
微信å°ç¨åºä½ä¸ºå¾®ä¿¡çæçæ ¸å¿ç»æé¨åï¼å·²ç»æä¸ºä¼ä¸æ°åå转åçéè¦å ¥å£ãæªè³2025å¹´ï¼å¾®ä¿¡å°ç¨åºæ¥æ´»è·ç¨æ·å·²çªç ´6亿ï¼è¦ççµåãæè²ãå»çãéèç200å¤ä¸ªç»åè¡ä¸ãç¶èï¼å°ç¨åºçæ¬è´¨æ¯åç«¯æ¡æ¶ï¼æææ ¸å¿ä¸å¡é»è¾ãæ°æ®åå¨ãæ¯ä»äº¤æé½éè¦éè¿å端APIæ¥å®æã
å¨ä¼å¤åç«¯ææ¯æ ä¸ï¼PHPåå以ä¸ä¼å¿æä¸ºå°ç¨åºå端å¼åçé¦éä¹ä¸ï¼
- æççæï¼Composerå 管çå¨ãLaravel/ThinkPHPçæ¡æ¶æä¾äºä¸°å¯çä¸é´ä»¶åORMæ¯æã
- é¨ç½²ææ¬ä½ï¼å 乿æèæä¸»æºåäºæå¡å¨é½åçæ¯æPHPï¼æ éé¢å¤é ç½®ç¯å¢ã
- å¼åæçé«ï¼æ éç¼è¯ãçæ´æ°ã丰å¯çå¼åææ¡£å社åºèµæºã
- æ§è½å¯æ©å±ï¼PHP 8.xå¼å ¥äºJITç¼è¯å¨ï¼æé Swooleåç¨æ©å±å¯å®ç°é«æ§è½å¼æ¥å¤çã
- å¾®ä¿¡å®æ¹SDKå ¼å®¹æ§å¥½ï¼ç¤¾åºç»´æ¤çEasyWeChatãwechat-php-sdkçåºè½å¿«é对æ¥å¾®ä¿¡å项è½åã
äºãç¯å¢æå»ºï¼ä»é¶æå»ºLNMPå¼åç¯å¢
æ¨è使ç¨LNMPï¼Linux + Nginx + MySQL + PHPï¼æLAMPæ¶æã以䏿¯æ¬å°å¼åç¯å¢æå»ºæ¥éª¤ï¼
2.1 使ç¨éæç¯å¢å¿«éæå»ºï¼æ¨èåå¦è ï¼
- Windowsï¼ä½¿ç¨phpStudyæLaragonï¼ä¸é®å®è£ Nginx/Apache + MySQL + PHP
- macOSï¼ä½¿ç¨MAMPæValet
- Linuxï¼ä½¿ç¨å®å¡é¢æ¿ï¼Webçé¢ä¸é®å®è£ è¿è¡ç¯å¢
2.2 æ¡æ¶éæ©å»ºè®®
ThinkPHP 8.xï¼å½äº§æ¡æ¶ï¼ä¸æææ¡£å®åï¼å¦ä¹ æ²çº¿å¹³ç¼ï¼éåä¸å°å项ç®å¿«éå¼åã
Laravel 11.xï¼å½é ä¸»æµæ¡æ¶ï¼ORMä¼é ãArtisanå½ä»¤è¡å·¥å ·å¼ºå¤§ï¼éåä¸å¤§å项ç®ã
2.3 å®è£ ThinkPHP8å¹¶é ç½®æ°æ®åº
composer create-project topthink/think tp-app
cd tp-app
# ä¿®æ¹ .env æä»¶é
ç½®æ°æ®åºè¿æ¥
# DB_TYPE=mysql
# DB_HOST=127.0.0.1
# DB_NAME=wechat_applet
# DB_USER=root
# DB_PASS=your_passwordä¸ã微信ç»å½æææµç¨ï¼codeæ¢åopenid + JWT Token认è¯
å°ç¨åºç»å½æ¯å端å¼åçæ ¸å¿ç¯èã微信ç»å½éç¨OAuth2.0ææç 模å¼ï¼å®æ´æµç¨å¦ä¸ï¼
- å端è°ç¨ wx.login() è·å临æ¶codeï¼æææ5åéï¼
- å端å°codeåéç»å端ï¼å端è°ç¨å¾®ä¿¡æ¥å£ code2Session
- å端æ¿å°openidåsession_keyï¼æ¥è¯¢æåå»ºç¨æ·è®°å½
- å端çæJWT Tokenè¿åå端ï¼åç»è¯·æ±æºå¸¦Token认è¯èº«ä»½
3.1 PHPç«¯æ ¸å¿ä»£ç å®ç°
// LoginController.php
public function login(Request $request)
{
$code = $request->param('code');
$appid = config('wechat.appid');
$secret = config('wechat.secret');
$url = "https://api.weixin.qq.com/sns/jscode2session?appid={$appid}&secret={$secret}&js_code={$code}&grant_type=authorization_code";
$result = json_decode(file_get_contents($url), true);
if (isset($result['errcode'])) {
return json(['code' => 0, 'msg' => 'ç»å½å¤±è´¥']);
}
$openid = $result['openid'];
$user = User::where('openid', $openid)->find();
if (!$user) {
$user = User::create(['openid' => $openid]);
}
$token = jwt_encode(['uid' => $user->id, 'openid' => $openid], config('jwt.key'));
return json(['code' => 1, 'msg' => 'ç»å½æå', 'data' => ['token' => $token]]);
}JWT Tokenç¸æ¯ä¼ ç»Sessionçä¼å¿ï¼æ ç¶æãéååå¸å¼æ¶æãç§»å¨ç«¯å好ãä¸éè¦æå¡ç«¯åå¨ä¼è¯ãæ¨èä½¿ç¨ firebase/php-jwt åºå®ç°ã
åãRESTful APIæ¥å£è®¾è®¡è§è
è¯å¥½çAPI设计æ¯å°ç¨åºåç«¯æ¶æçåºç¡ã以䏿¯æ ¸å¿è®¾è®¡ååï¼
4.1 èµæºå½åè§è
| æä½ | æ¹æ³ | URLç¤ºä¾ |
|---|---|---|
| è·åååå表 | GET | /api/v1/products |
| è·åå个åå | GET | /api/v1/products/123 |
| å建åå | POST | /api/v1/products |
| æ´æ°åå | PUT | /api/v1/products/123 |
| å é¤åå | DELETE | /api/v1/products/123 |
4.2 ç»ä¸ååºæ ¼å¼
{
"code": 1,
"msg": "success",
"data": { ... },
"timestamp": 1751404800
}4.3 ä¸é´ä»¶ä½ç³»è®¾è®¡
- Authä¸é´ä»¶ï¼éªè¯JWT Tokenï¼è§£æç¨æ·èº«ä»½
- Throttleä¸é´ä»¶ï¼é¢çéå¶ï¼é²æ¢æ¶æè¯·æ±
- Logä¸é´ä»¶ï¼è®°å½å ³é®APIè°ç¨æ¥å¿
- Corsä¸é´ä»¶ï¼å¤çè·¨å请æ±ï¼å¦ææH5端ï¼
äºãæ ¸å¿æ¥å£å®æå¼å
5.1 ç¨æ·ç®¡çæ¥å£
é¤ç»å½å¤ï¼è¿éè¦å¤´åæµç§°æ´æ°ãææºå·ç»å®ï¼å¾®ä¿¡getPhoneNumberï¼ãæ¶è´§å°åCRUDçã
5.2 æ°æ®CRUDæ¥å£
以æç« å表为ä¾ï¼
public function index(Request $request)
{
$page = $request->param('page', 1);
$limit = $request->param('limit', 10);
$list = Article::where('status', 1)
->order('create_time', 'desc')
->paginate(['page' => $page, 'list_rows' => $limit]);
return json(['code' => 1, 'data' => $list]);
}5.3 æä»¶ä¸ä¼ æ¥å£
å°ç¨åºä¸ä¼ å¾çéä½¿ç¨ wx.chooseImage + wx.uploadFileï¼åç«¯æ¥æ¶ï¼
public function upload(Request $request)
{
$file = $request->file('image');
$validate = ['size' => 5 * 1024 * 1024, 'ext' => 'jpg,png,gif,webp'];
$path = Filesystem::disk('public')->putFile('uploads', $file);
return json(['code' => 1, 'data' => ['url' => '/storage/' . $path]]);
}5.4 微信æ¯ä»æ¥å ¥
微信æ¯ä»æ¯åä¸å°ç¨åºçæ ¸å¿åè½ãæ¨è使ç¨JSAPIæ¯ä»æ¹å¼ï¼
- å端è°ç¨å¾®ä¿¡ç»ä¸ä¸åæ¥å£ï¼è·åprepay_id
- åç«¯çææ¯ä»ç¾åï¼appIdãtimeStampãnonceStrãpackageãsignTypeãpaySignï¼
- åç«¯ä½¿ç¨ wx.requestPayment è°èµ·æ¯ä»
- å端é ç½®æ¯ä»åè°æ¥å£ï¼notify_urlï¼ï¼å¤çæ¯ä»ç»æ
注æï¼å¾®ä¿¡æ¯ä»v3æ¥å£ä½¿ç¨APIV3å¯é¥+è¯ä¹¦æ¹å¼ï¼ç¾åç®æ³ä»MD5å级为RSA-SHA256ã
å ãæ¥å£å®å ¨ï¼å¤å±é²æ¤ä½ç³»
å°ç¨åºå端å®å ¨ä¸å®¹å¿½è§ï¼ä»¥ä¸æ¯å¿ 须宿½çå®å ¨æªæ½ï¼
6.1 请æ±ç¾åéªè¯
- 客æ·ç«¯ä½¿ç¨åºå®å¯é¥å¯¹è¯·æ±åæ°æåºåçæMD5/SHA256ç¾å
- æå¡ç«¯éªè¯ç¾åï¼é²æ¢åæ°è¢«ç¯¡æ¹
- å å ¥æ¶é´æ³éªè¯ï¼é²æ¢éæ¾æ»å»ï¼æææå»ºè®®5åéï¼
6.2 é²SQLæ³¨å ¥
- 100%使ç¨åæ°ç»å®ï¼Prepared Statementï¼ï¼ç»ä¸æ¼æ¥SQLå符串
- ä½¿ç¨æ¡æ¶ORMèªå¸¦é²æ¤ï¼ThinkPHPæ¥è¯¢æé å¨ãLaravel Eloquentåé»è®¤é²æ¤ï¼
- å¯¹ç¨æ·è¾å ¥è¿è¡ä¸¥æ ¼çç±»åæ ¡éªåé¿åº¦éå¶
6.3 é¢çéå¶
- 使ç¨Rediså®ç°IP级å«åç¨æ·çº§å«ç请æ±é¢çéå¶
- ç»å½æ¥å£éå¶ï¼åä¸IPæ¯åéæå¤10次
- çä¿¡/é®ä»¶å鿥å£ï¼å䏿æºå·æ¯60ç§æå¤1æ¬¡ï¼æ¯å¤©æå¤10次
6.4 HTTPS强å¶
微信å°ç¨åºè¦æ±ææè¯·æ±å¿ 须使ç¨HTTPSãæå¡å¨å¿ é¡»é ç½®ææçSSLè¯ä¹¦ï¼æ¨èLet’s Encryptå è´¹è¯ä¹¦ï¼ï¼é ç½®Nginx强å¶è·³è½¬HTTPSï¼
server {
listen 80;
server_name api.example.com;
return 301 https://$host$request_uri;
}ä¸ãå°ç¨åºå®¡æ ¸ä¸çº¿æ³¨æäºé¡¹
å¼å宿åï¼ä¸çº¿åéè¦å好以ä¸åå¤ï¼
- æå¡å¨ååé ç½®ï¼å¨å°ç¨åºç®¡çåå°ãå¼å-å¼å管ç-æå¡å¨ååãé ç½®requeståæ³ååãuploadFileåæ³ååçï¼å¿ 须为HTTPSä¸å·²å®æICP夿¡
- ç±»ç®éæ©ï¼æ ¹æ®ä¸å¡ç±»åéæ©æ£ç¡®çæå¡ç±»ç®ï¼ä¸åç±»ç®æéèµè´¨ä¸åï¼
- å å®¹å®¡æ ¸ï¼ç¡®ä¿ä¸æ¶åæ¿æ²»ææãè²æ ãèåä¿¡æ¯çå 容
- ç¨æ·éç§åè®®ï¼å¿ é¡»å¨é¦æ¬¡ä½¿ç¨æ¶å¼¹åºéç§å议弹çªå¹¶è·åç¨æ·åæ
- æµè¯å åï¼æäº¤å使ç¨çæºè°è¯ãä½éªçæµè¯æææ ¸å¿æµç¨
- çæ¬ç®¡çï¼å»ºè®®é ç½®ç°åº¦åå¸çç¥ï¼å ç»é¨åç¨æ·æ¨éæ°çæ¬éªè¯ç¨³å®æ§
å «ãæ»ç»
æ¬æä»ææ¯éååºåï¼ç³»ç»è®²è§£äºPHPå¼å微信å°ç¨åºå端ç宿´æµç¨ï¼ç¯å¢æå»ºâç»å½ææâAPIè®¾è®¡âæ ¸å¿æ¥å£å®ç°âå®å ¨é²æ¤âä¸çº¿åå¸ãææ¡è¿äºå 容åï¼ä½ å®å ¨å¯ä»¥ç¬ç«å®æä¸ä¸ªåä¸å°ç¨åºçå端å¼åã
å¨å®é 项ç®ä¸ï¼è¿å¯ä»¥æ ¹æ®ä¸å¡éæ±æ©å±æ´å¤è½åï¼æ¶æ¯æ¨éï¼æ¨¡æ¿æ¶æ¯/è®¢é æ¶æ¯ï¼ã微信æ¯ä»åï¼å ç¨åä»ï¼ãç©æµå©æãå 容å®å ¨æ£æµï¼ææ¬/å¾çå®¡æ ¸ï¼çãPHPçæå¯¹è¿äºè½å齿æççè§£å³æ¹æ¡ã
éè¦å°ç¨åºå¼åæå¡ï¼
ä¸ç§äºèæä¾ä¸ä¸ç微信å°ç¨åºå®å¶å¼åãä¼ä¸ç½ç«å»ºè®¾ãSEOä¼åçä¸ç«å¼æå¡ã
ð± 微信ï¼diycloud
ð å®ç½ï¼www.yimiaonet.com
ð çµè¯ï¼400-716-8908
声明与免责说明
- 1. 本站部分图片来源于 Unsplash,版权归原作者所有。
- 2. 本站文章、开源代码及免费下载资源仅供个人学习、研究或非商业用途参考,禁止用于商业盈利,版权归原作者所有。
- 3. 内容(含图片、文章、代码)部分转载自网络,若存在侵权,请联系 meng@yimiaonet.com 处理。
- 4. 未经本站书面许可,不得复制、盗用、采集、传播本站内容至任何平台。
- 5. 本站内容不构成专业建议,“OKMG”为注册商标,官方网站:www.okmg.cn,本站保留修改本声明的权利。

