整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Node.js 實現搶票小工具&短信

          Node.js 實現搶票小工具&短信通知提醒(上)「干貨」

          者:西嵐

          轉發鏈接:https://juejin.im/post/5dadd0236fb9a04de04d968e

          只需編寫簡單的云函數,就可以實現自己的業務邏輯,發布后就可以生成自己的接口給客戶端調用。

          果創云支持對云函數進行在線接口編程,進入開放平臺我的接口 - 在線接口編程,設計一個新接口,設計和配置好接口參數、接口名稱、接口返回后,再把云函數源代碼填上,提交審核通過并發布后即可使用。

          云函數編寫入口:在線接口編程。

          云函數優勢

          云函數具有以下特點和優勢:

          • 1、無需管理服務器即可運行移動后端代碼
          • 2、可在線接口編程,自動生成云接口和接口文檔
          • 3、代碼簡單,功能強大,一行代碼就可以實現數據庫、短信發送等功能
          • 4、可以開發自己的接口,實現自己的業務邏輯

          云函數架構

          云函數由開發者自己編寫,發布后可生成自己的云接口,即MyAPI,而云函數底層則依賴于果創云提供的基礎服務。

          因此,云函數整體架構如下:

          整體架構分為四層:

          • 第一層:MyAPI我的接口 提供給客戶端調用的云接口。
          • 第二層:云函數。 由開發者自己編寫,可在線接口編程,編寫云函數,生成接口。
          • 第三層:果創云聚合服務 由果創云提供,封裝了常用的服務,可進行數據庫、CURL、短信等服務操作。
          • 第四層:云服務 由第三方提供的云服務,包括但不限于自建數據庫、云數據庫、企業郵箱、短信接口、開放平臺接口和內部接口等。

          云函數格式

          當前只支持PHP云函數,開發者自定義的云函數,需要符合PHP語法。其云函數簽名和云函數模板如下:

          function ($params, $di) {
              $result=array('err_code'=> 0, 'err_msg'=> '');
          
              // TODO
              // 在這里編寫你的具體業務
          
              return $result;
          }

          云函數參數

          云函數參數說明:

          • $params,類型:數組,為當前客戶端的接口參數,由開發者配置的接口參數和客戶端動態傳遞的參數而定,例如:array('uuid'=> null, 'left'=> 1, 'right'=> 2)
          • $di,類型:數組,為DI容器,里面封裝并提供了眾多強大而實用的PHP服務,例如數據庫操作等,對于后端編程有非常大的幫助,后面會詳細介紹。

          獲取接口參數

          如何獲取客戶端傳遞過來的接口參數?

          在果創云開放接口參數配置,添加參數后,就可以在源代碼中獲取。如下:

          假設,配置的接口參數名字為:abc,那么在PHP源代碼中,獲取接口參數的方式是從$params參數中獲取,如:

          $abc=$params['abc'];

          參數名稱和配置的接口名稱一致。并且,此時獲取的接口參數會根據配置的接口參數規則進行過濾、轉換和檢測。

          溫馨提示:接口會自動對客戶端的參數進行校驗、核對和轉換,通過$params參數獲取的是最終可用的參數。

          云函數代碼規范

          開頭不需要<?php標簽,結束不需要?>標簽。你可以在本地調試好PHP代碼函數,或者通過在線工具編寫和運行你的PHP代碼。

          特別注意以下幾點:

          • 1、接口代碼需要符合PHP語法,PHP語法可參考PHP 教程
          • 2、一些敏感的PHP函數和API接口會被禁用,例如讀寫本地文件、獲取系統信息等。

          如何進行本地調試? 在本地調試時,可以這樣執行你的PHP代碼。首先,創建一個PHP文件,例如:yesapi.php,然后在里面放置代碼:

          <?php
          $fun=function ($params, $di) {
              // 函數內的代碼復制過來
              $result=array('err_code'=> 0, 'err_msg'=> '');
          
              $result['sum']=$params['left'] + $params['right'];
          
              return $result;
          };
          
          // 模擬一些測試數據
          $params=array('left'=> 1, 'right'=> 2);
          
          // 執行函數,輸出結果
          var_dump($fun($params, array()));
          
          // 輸出結果 1+2=3
          array(3) {
              ["err_code"]=>
              int(0)
              ["err_msg"]=>
              string(0) ""
              ["sum"]=>
              int(3)
          }

          即這樣執行,通過CLI方式運行。

          $ php ~/tmp/test.php          
          array(3) {
              ["err_code"]=>
              int(0)
              ["err_msg"]=>
              string(0) ""
              ["sum"]=>
              int(3)
          }

          溫馨提示:在本地沒有$di服務,可以使用空數組來代替,或進行模擬測試。

          云函數運行結果

          如何返回接口結果呢?

          以下是一個返回示例:

          return array('err_code'=> 0, 'err_msg'=> '', 'title'=> 'Hi, 歡迎使用果創云開放接口!');

          注意,應該在函數的最后一行代碼通過return關鍵字返回結果。結果的類型是數組,且應包括:err_code、err_msg這兩個基本字段,以及其他需要自定義的返回字段。其中,約定err_code為0表示成功。

          云函數示例

          以下是一個簡單的例子,進行兩個數的相加。

          function ($params, $di) {
              $result=array('err_code'=> 0, 'err_msg'=> '');
              $result['sum']=$params['left'] + $params['right'];
              return $result;
          }

          添加一個新接口,并進行編輯:

          編寫接口時,設置接口參數、接口返回、云函數代碼等,如(局部截圖):

          保存后,你可以看到類似這樣的在線接口文檔(部分截圖):

          提交審核和發布

          在完成接口設計和云函數開發后,就可以勾選“申請發布”。等審核通過后即可發布和使用。

          生成云接口和接口文檔

          發布通過后,你就可以生成了自己的云接口,以及在線接口文檔。

          在線接口文檔,可以提供給客戶端開發人員查看和接入使用;云接口可以提供給客戶端進行調用。

          生成的完整在線接口文檔類似:

          接口文檔地址:

          http://api.yesapi.cn/docs.php?service=SVIP.Sdogstar_MyApi.ATest&detail=1&type=fold

          客戶端調用后,就可以得到云函數執行后的結果。

          編寫好云函數后,會自動生成云接口,和接口文檔。如果需要,也可以自己手動編寫接口文檔。

          溫馨提示:如果需要手動編寫API接口文檔,可以進入我的在線文檔編輯,保存后可發布接口文檔。

          文檔編輯后臺:

          保存后,外部查看的接口文檔效果:

          如何支持多個客戶端接入?

          如果需要支持多個客戶端調用API接口,可以【客戶端管理】,添加客戶端應用,然后分配app_key和密鑰。

          云函數PHP開發手冊

          以下通過代碼示例和模板,介紹云函數如何進行開發,大家可以把代碼復制過去,稍作修改。只需要簡短的幾行PHP代碼,或者一段代碼,你就實現自己的業務邏輯,無需管理服務器即可運行移動后端代碼。

          HIGHLIGHT 開發須知

          在開始,以下是一些重要的知識點和注意事項。

          • 我的模型數據庫操作請使用:$di['db']->模型英文名稱_tbl,例如文章模型:$di['db']->article_tbl,后面要固定加上_tbl;
          • 直連數據庫(MySQL/SQLServer等)操作請使用:$di['db_super']->數據庫表完整名稱,例如:$di['db_super']->article;使用前請配置接入你的數據庫。

          再重復說明下,直連數據庫和我的模型數據庫操作一樣,區別在于:直連數據庫在使用前需要先配置接入你的數據庫,DI服務使用$di['db_super'],最后需要填寫完整的表名稱,不需要額外的_tbl后綴。

          DI服務一覽

          DI服務 功能說明 備注 $di['db'] 我的模型數據庫 可進行CURD數據庫操作,針對單表 $di['db_super'] 直連數據庫 可進行CURD數據庫操作,針對單表,使用前需要進行MySQL數據庫直連服務配置 $di['logger'] 日志服務 紀錄各種日志 $di['email'] 郵箱服務 發送郵件,使用前需要進行郵箱服務配置 $di['pinyin'] 拼音服務 將漢字轉成拼音 $di['curl'] CURL服務 請求遠程接口,僅支持80端口 $di['crypt'] 安全服務 對數據進行加密和解密 $di['sms_aliyun'] 阿里云短信 通過阿里云服務發送短信,使用前需要進行阿里云服務配置

          云函數代碼模板

          F1-1、兩數相加

          function ($params, $di) {
              $result=array('err_code'=> 0, 'err_msg'=> '');
              $result['sum']=$params['left'] + $params['right'];
              return $result;
          }

          假設傳遞參數為:left=1&right=2,請求此云函數后,將會得到如下結果:

          {
              "ret": 200,
              "data": {
                  "err_code": 0,
                  "err_msg": "",
                  "sum": 3
              },
              "msg": "V2.1.1 YesApi"
          }

          F1-2、數據庫-獲取模型總數

          function ($params, $di) {
              $result=array('err_code'=> 0, 'err_msg'=> '');
              $result['count']=$di['db']->article_tbl->count('id'); // 模型名稱后面須帶上_tbl后綴
              return $result;
          }

          假設你有模型如下,有23條數據:

          請求此云函數后,將會得到如下結果:

          {
              "ret": 200,
              "data": {
                  "err_code": 0,
                  "err_msg": "",
                  "count": 23
              },
              "msg": "V2.1.1 YesApi"
          }

          F1-3、數據庫-添加模型數據

          function ($params, $di) {
              $result=array('err_code'=> 0, 'err_msg'=> '');
              $article=$di['db']->article_tbl;
              $article->insert($data);
              $result['id']=$article->insert_id(); // 返回新增的ID
              return $result;
          }

          F1-4、數據庫-查詢模型數據

          function ($params, $di) {
              $result=array('err_code'=> 0, 'err_msg'=> '');
              $result['article']=$di['db']->article_tbl->where('id', 1)->fetchOne(); // 取出id=1的文章數據
              return $result;
          }

          F1-5、數據庫-更新模型數據

          function ($params, $di) {
              $result=array('err_code'=> 0, 'err_msg'=> '');
              $data=array('title'=> '新文章標題', 'content'=> '文章內容'); // 待更新的數據
              $result['update_row']=\$di['db']->article_tbl->where('id', 1)->update($data); // 更新id=1的文章數據,返回更新的數量
              return $result;
          }

          F1-6、數據庫-刪除模型數據

          function ($params, $di) {
              $result=array('err_code'=> 0, 'err_msg'=> '');
              $result['delete_row']=$di['db']->article_tbl->where('id', 1)->delete(); // 刪除數據,返回刪除的數量
              return $result;
          }

          F1-7、數據庫-獲取模型列表數據

          function ($params, $di) {
              $result=array('err_code'=> 0, 'err_msg'=> '');
              $result['list']=$di['db']->article_tbl->where('id > ?', 1)->where('id < ?', 10)->fetchAll(); // 取出id從1到10的全部數據
              return $result;
          }

          F1-8、數據庫-獲取模型列表數據(搜索+分頁+排序+字段選擇)

          function ($params, $di) {
              $result=array('err_code'=> 0, 'err_msg'=> '');
              $result['list']=$di['db']->article_tbl
                  ->select('id, title, content')
                  ->where('id', 1) // 精確區配
                  ->where('name LIKE ?', '%小白%') // 模糊匹配
                  ->where('id', array(1, 2, 3)) // 范圍枚舉
                  ->where('id > ?', 1) // 范圍大于
                  ->where('id < ?', 10) // 范圍小于
                  ->where('id BETWEEN ? AND ?', array(1, 10)) // 范圍介于
                  ->or('status', 1) // 或邏輯條件
                  ->order('add_time DESC') // 按時間降序
                  ->limit(0, 100) // 分頁,取出前面100條
                  ->fetchAll(); // 取全部數據
              return $result;
          }

          溫馨提示:獲取列表數據時,一定要使用limit限制分頁數量,否則會審核不通過。

          F2-1、CURL-GET請求

          function ($params, $di) {
              $result=array('err_code'=> 0, 'err_msg'=> '');
              // 第一個參數為網址,第二個參數表示超時時間(單位毫秒)
              $result['res']=$di['curl']->get('http://demo.phalapi.net/?username=YesApi', 3000);
              // 得到結果類似:{"ret":200,"data":{"title":"Hello YesApi","version":"2.13.3","time":1590764249},"msg":""}
              return $result;
          }

          F2-2、CURl-POST請求

          function ($params, $di) {
              $result=array('err_code'=> 0, 'err_msg'=> '');
              // 第一個參數為網址,第二個參數是POST的參數,第三個參數表示超時時間(單位毫秒)
              $result['res']=$di['curl']->post('http://demo.phalapi.net/', array('username'=> 'YesApi'), 3000);
              // 得到結果類似:{"ret":200,"data":{"title":"Hello YesApi","version":"2.13.3","time":1590764249},"msg":""}
              return $result;
          }

          溫馨提示:通過云函數以及CURL,可以對原有的API接口進行封裝,形成對外開放的接口API。

          F3-1、日志

          function ($params, $di) {
              $result=array('err_code'=> 0, 'err_msg'=> '');
              $di['logger']->record('DEBUG', '調試日志,這里可放日志內容');
              $di['logger']->record('INFO', '業務日志,這里可放日志內容');
              $di['logger']->record('INFO', array('uuid'=> 'ABC', 'tip'=> '第二個參數還可以是數組'));
              $di['logger']->record('NOTICE', '提醒日志,這里可放日志內容');
              $di['logger']->record('WARNNING', '警告日志,這里可放日志內容');
              $di['logger']->record('ERROR', '錯誤日志,這里可放日志內容');
              return $result;
          }

          溫馨提示:日志紀錄后,可以到開放平臺查看日志。

          F4-1、發送郵件

          function ($params, $di) {
              $result=array('err_code'=> 0, 'err_msg'=> '');
              // 第一個參數是收件人郵箱,第二個參數是郵件標題,第三個參數是郵件正文內容(HTML格式)
              $result['is_send']=$di['email']->send('helper@yesapi.cn', '郵件標題', '郵件內容');
              return $result;
          }

          溫馨提示:使用前請先配置郵箱服務配置。

          F5-1、安全-加密解密

          function ($params, $di) {
              $result=array('err_code'=> 0, 'err_msg'=> '');
              $result['encrypt_data']=$di['crypt']->encrypt('YesApi'); // 對數據進行加密
              $result['decrypt_data']=$di['crypt']->decrypt($result['encrypt_data']); // 對數據進行解密
              return $result;
          }

          溫馨提示:每個app_key加密的數據,只能由自己的app_key進行解密。

          F6-1、拼音

          function ($params, $di) {
              $result=array('err_code'=> 0, 'err_msg'=> '');
              $result['pinyin_1']=$di['pinyin']->convert('小白接口'); // 將一段漢字串內容轉成拼音,結果是:xiao bai jie kou
              $result['pinyin_2']=$di['pinyin']->abbr('小白接口'); // 獲取拼音首字母,結果是:x b j k
              $result['pinyin_3']=$di['pinyin']->name('張三'); // 姓名轉拼音,結果是:zhang san
              return $result;
          }

          F7-1、發送短信

          function ($params, $di) {
              $result=array('err_code'=> 0, 'err_msg'=> '');
              // 參數1:手機號,參數2:短信簽名,參數3:短信模板,參數3:更多數組參數(沒動態參數時可傳空數組)
              $di['sms_aliyun']->aliyunSendSms('13800138000', '小白接口', 'SMS_153055065', array('code'=> '123456'));
              return $result;
          }

          溫馨提示:使用前需要進行阿里云服務配置

          F9、實用函數

          function ($params, $di) {
              $result=array('err_code'=> 0, 'err_msg'=> '');
              $time=time(); // 當前時間戳,例如:1590561632
              $datetime=date('Y-m-d H:i:s'); // 當前時間,例如:2020-05-20 00:00:00
              $arr=json_decode('{"name":"YesApi"}', true); // json解析成數組
              $json=json_encode($arr); // 數組轉json
              $md5=md5('123456'); // md5操作
              return $result;
          }

          更多示例,即將到來!

          說到發短信驗證碼接口,第一印象就是好貨不便宜,速度快、送達率高的通道各大短信接口廠商收費也好貴,小微個人不舍得接入,也不符合大部分大廠的準入門檻。

          想著自己幾張手機卡面每月還有幾千條免費短信是不是能好好利用一下,做個能發送短信的app在后臺運行問題也不大,不過自己手機號還是不要亂搞的為好。

          曙光

          研發App過程中發現有幾個大平臺對App提供免費短信驗證碼,微博開放平臺Mob,App上用完全免費,但Web Api都不免費,也許App內接入SDK可以讓他們收回成本吧(真實情況是:收益遠大于成本)。

          雖然不直接提供免費Web Api,那我們是不是可以通過App來發驗證碼:手機打開App在后臺運行,只有有發驗證碼的需求時,App自動調用SDK發送驗證碼。

          通過研究微博和Mob的文檔發現,理論上是可行的,除了符合國情的標準限制(單手機號每分鐘、每天限制)外,每個應用也有速率限制。但對小微網站來講(沒啥流量的博客啥的),遠遠夠用,一天撐死了發100條短信,一小時下來也發不了幾條。

          注意:流量大的不能用本文這個方法,穩定性和安全性大幅下降,都有這么大流量了,應該不差錢接穩定的短信接口吧。本文只適用于學習、小流量網站之用。

          說干就干

          首先要有個App,并且接入了免費短信SDK,能正常發短信(沒有?寫一個App,然后嘗試申請一下)。有很多混合app開發平臺,會js+css就能開發出來,當然原生的最好。

          流程圖:

          流程分解

          一、自研短信API網關

          就是個普通REST API,提供3個接口:

          1. 單條驗證碼短信發送請求接口,只需提交手機號參數,然后接口把請求加入隊列
          2. 發送請求隊列拉取接口,用于手機App后臺任務定時拉取發送隊列 (改為WebSocket推送會不會快一些,復雜且沒價值!)。
          3. [可選]App發送短信后的回執接口,保存發送結果信息。

          二、一個手機+自研App(只要成功接入第三方就行)

          當然是手機后臺跑著我們的App,然后定時拉取自研短信API網關的隊列數據,有發送請求數據就調用第三方SDK進行驗證碼發送,順帶保存回執。

          三、網站使用

          在需要發短信驗證碼的地方調用我們自己的短信API網關。

          用戶提交短信驗證碼后調用第三方接口對驗證碼進行校驗(也許有第三方可以發自定義短信,驗證碼由我們自己生成,就不需要和第三方打交道了)。

          注意要點

          1. 我們要保證手機App在后臺長時間穩定駐留,保證網絡穩定。
          2. 有備用收費短信接口,避免在我們的短信API網關無法正常發送短信時,直連收費短信接口。
          3. 提高可用性,如果用戶是首次點擊發送驗證碼按鈕,這次請求發往我們的短信API網關,如果是第二次點擊發送驗證碼按鈕(沒有收到驗證碼用戶重試),發往收費短信接口,穩定性大幅提高。
          4. 此方法小流量網站可用,大流量硬要強上,也許準備個手機集群、申請N個App輪換使用,哈哈哈。

          使用案例

          由于我沒用5分錢的短信接口,用戶首次發送驗證碼走的是老東家App的SDK免費短信接口。比如:注冊、找回密碼、綁定支付寶賬號使用到此接口。

          我用一個老手機來運行的App,15秒播報語音播報一次錯誤數量(報警用),一直放在那里不動,一直報0,效果還不錯。

          后臺App

          純javascript代碼實現的,截了個圖:

          好了,喜歡自己動手的小伙伴可以去試一下了。


          主站蜘蛛池模板: 国产一区二区三区在线视頻| 国产精品日本一区二区在线播放| 国产自产V一区二区三区C| 国产伦精品一区二区三区视频猫咪 | 久久无码人妻一区二区三区 | 国产精品福利一区| 国产精品一区在线观看你懂的| 人妻体内射精一区二区三区| 91福利国产在线观看一区二区| 日韩在线一区视频| 日韩人妻无码一区二区三区99| 99偷拍视频精品一区二区| 日本内射精品一区二区视频 | 久久精品成人一区二区三区| 久久福利一区二区| 在线一区二区三区| 无码日韩人妻av一区免费| 亚洲成AV人片一区二区密柚| 人妻AV中文字幕一区二区三区| 一区二区三区四区无限乱码 | 一区二区视频免费观看| 国产中文字幕一区| 视频一区视频二区制服丝袜 | 精品中文字幕一区在线| 国产精品亚洲一区二区三区在线观看| 亚洲国产日韩在线一区| 中文字幕日韩一区| 国产美女在线一区二区三区| 99久久人妻精品免费一区| 精品无码日韩一区二区三区不卡| 久久久久无码国产精品一区| 无码人妻久久一区二区三区| 精品一区二区三区在线观看视频| 蜜桃视频一区二区三区在线观看 | 在线免费观看一区二区三区| 精品国产免费观看一区 | 在线电影一区二区| 国产一区二区三区精品久久呦| 国产精品盗摄一区二区在线| 一区五十路在线中出| 亚洲日韩国产精品第一页一区|