申請證書
- 登錄:阿里雲控制檯,產品與服務,證書服務,購買證書。
- 購買:證書類型選擇 免費型DV SSL,然後完成購買。
要來回點擊尋找一下,因爲免費版隱藏了
[外鏈圖片轉存失敗(img-oJWmi8sS-1567235993417)(https://user-images.githubusercontent.com/17243165/38716964-559f0ab2-3f16-11e8-9ced-10ab483be7bc.png)]
配置
等待阿里雲簽發成功,然後在右邊欄目裏面選擇下載
安裝證書
文件說明:
- 證書文件1523928142501.pem,包含兩段內容,請不要刪除任何一段內容。
- 如果是證書系統創建的CSR,還包含:證書私鑰文件1523928142501.key、證書公鑰文件public.pem、證書鏈文件chain.pem。
( 1 ) 在Apache的安裝目錄下創建cert目錄,並且將下載的全部文件拷貝到cert目錄中。如果申請證書時是自己創建的CSR文件,請將對應的私鑰文件放到cert目錄下並且命名爲1523928142501.key;
( 2 ) 打開 apache 安裝目錄下 conf 目錄中的httpd.conf
文件,找到以下內容並去掉“#”:
#LoadModule ssl_module modules/mod_ssl.so (如果找不到請確認是否編譯過 openssl 插件)
#Include conf/extra/httpd-ssl.conf
( 3 ) 打開 apache 安裝目錄下 conf/extra/httpd-ssl.conf
文件 (也可能是conf.d/ssl.conf,與操作系統及安裝方式有關), 在配置文件中查找以下配置語句:
# 添加 SSL 協議支持協議,去掉不安全的協議
SSLProtocol all -SSLv2 -SSLv3
# 修改加密套件如下
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLHonorCipherOrder on
# 證書公鑰配置
SSLCertificateFile cert/public.pem
# 證書私鑰配置
SSLCertificateKeyFile cert/1523928142501.key
# 證書鏈配置,如果該屬性開頭有 '#'字符,請刪除掉
SSLCertificateChainFile cert/chain.pem
( 4 ) 重啓 Apache。
( 5 ) 通過 https 方式訪問您的站點,測試站點證書的安裝配置,如遇到證書不信任問題
這裏注意如果使用阿里雲還要在安全組規則裏面設置443端口的出入方向
Apache反向代理設置https
因爲我是用express框架寫的後端,apache默認佔了80端口,express可以通過反向代理來享用80端口
首先在 httpd.conf 啓用必要的模塊,也就是如果去掉下面這幾行前面的 #
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
Include conf/extra/httpd-ssl.conf
在 httpd.conf 末端添加如下設置,注意 ProxyPass
和 ProxyPassReverse
設置爲express框架暴露的端口,並且設置好 SSLCertificateFile
和 SSLCertificateKeyFile
的路徑,路徑就是上面安裝證書步驟裏面的路徑
<VirtualHost *:80>
ServerAdmin www.smms.ink
ServerName www.smms.ink
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://127.0.0.1:1314/
ProxyPassReverse / http://127.0.0.1:1314/
</VirtualHost>
<virtualhost *:443>
ServerName www.smms.ink
<proxy>
Order deny,allow
Allow from all
</proxy>
SSLEngine On
SSLProxyEngine On
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLCertificateFile cert/public.pem
SSLCertificateKeyFile cert/1523928142501.key
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:1314/
ProxyPassReverse / http://127.0.0.1:1314/
</virtualhost>
此時當我們訪問 https://www.xxx.com
就等於 訪問到內網的 http://127.0.0.1:1314
這樣對 https://www.xxx.com
的訪問,返回的數據將是來自 http://127.0.0.1:1314
上面的這個配置思路總結爲如下三步:
- 正常啓動express項目在1314端口
- 然後用apache服務器實現反向代理
- 再用apache配置https
Apache和node共享端口
思路是通過不同域名來區分進去是apache解析還是node解析文件,可以利用二級域名來劃分
ProxyPass / http://127.0.0.1:9000/
ProxyPassReverse / http://127.0.0.1:9000/
/ 映射到 http://127.0.0.1:9000/
你可以根據自己的路由規則來實現不用的需求,例如:
ProxyPass / http://127.0.0.1:9000/
ProxyPassReverse / http://127.0.0.1:9000/
ProxyPass /nodejs http://127.0.0.1:1314
ProxyPassReverse /nodejs http://127.0.0.1:1314
此時我們可以根據不同的二級路由進入內網的不同端口,撥入我們可以把/nodejs分配給node開的1314端口,那麼外網就可以通過https://xxx/nodejs/xxx進入到nodejs的服務器中,對應如果是其他路由就會進入到apache服務器中
企業支付寶接入
接入之前建議先看官方文檔比較詳細
創建應用
首先有企業支付寶賬號,登錄企業支付寶管理中心,登錄不知道是不是安全校驗太頻繁,官網輸入登錄的時候特別卡特別慢,進入開發者中心,因爲我選擇的是網頁&移動應用,要提供網址通過審覈,審覈通過就會出現下面的已上線應用
配置RSA密鑰
下載官網中的RSA簽名驗籤工具配置RSA2密鑰,會生成應用公鑰和應用密鑰,注意上面選擇中有JAVA適用和非JAVA適用的選項,因爲我後端選擇PHP所以我選擇了非JAVA適用的PKCS1
[外鏈圖片轉存失敗(img-VRu73Tmi-1567235993420)(https://user-images.githubusercontent.com/17243165/39089579-46ed64a8-45fd-11e8-9e12-cbf680e1021f.png)]
把應用公鑰上傳應用信息中的開發配置中,還有開發配置中的應用網關不是必填項,可以選擇不填,然後將旁邊的支付寶密鑰複製到後端的SDK中的config.php中alipay_public_key字段後,注意應用公鑰是跟支付寶密鑰完全不同的,不要弄錯,不然一會兒驗籤會失敗
[外鏈圖片轉存失敗(img-ukhwOdkR-1567235993421)(https://user-images.githubusercontent.com/17243165/39089606-006b88ec-45fe-11e8-9d0d-3f03364a90a8.png)]
配置服務器
下載對應的SDK文件手機網站支付DEMO,這裏根據對應的需求進行下載,有對應不同後端語言的,我下載的手機網站支付是有包含完整前後端的邏輯的DEMO
一般來說最簡單的測試只需要配置config.php文件就可以了
<?php
$config = array (
//應用ID,您的APPID。
'app_id' => "xxxx",
//商戶私鑰,您的原始格式RSA私鑰,也就是應用私鑰
'merchant_private_key' => "xxxx",
//異步通知地址
//這裏最好用http 支付寶的異步的回調在免費https證書下會失敗
'notify_url' => "http://工程公網訪問地址/alipay.trade.wap.pay-PHP-UTF-8/notify_url.php",
//同步跳轉
//'return_url' => "http://mitsein.com/alipay.trade.wap.pay-PHP-UTF-8/return_url.php",
//編碼格式
'charset' => "UTF-8",
//簽名方式
'sign_type'=>"RSA2",
//支付寶網關
'gatewayUrl' => "https://openapi.alipay.com/gateway.do",
//支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm
//對應APPID下的支付寶公鑰。注意是支付寶公鑰,而不是應用公鑰,支付寶公鑰是基於上傳的應用公鑰生成的
'alipay_public_key' => "xxxx",
);
這裏注意兩點支付寶公鑰和應用公鑰,不要粘貼錯,這裏需要的是支付寶公鑰而不是應用公鑰,還有點就是notify_url和return_url
return_url
是支付成功後在客戶端返回給客戶看的回調地址,需要和開發配置中的授權回調地址對應,這是支付寶對支付的一種校驗,這個地址建議不要寫任何支付後的操作邏輯,因爲用戶有可能會在客戶端切掉看不到而影響邏輯判斷
notify_url
是支付成功後支付寶通知給服務端的回調地址,這個地址注意要在公網可訪問,因爲支付寶會響應它,所以在本地測試中是不行的,必須上傳到公網服務器,還有這裏注意的是使用阿里雲的免費https證書時候,這裏如果地址是https會有一定失敗率的,也就是說這裏如果用了阿里雲的免費https證書最好還是用回http地址響應,如果響應成功會echo出success這7個字符給支付寶,說明驗籤成功了,所以這個文件不要包含任何html代碼,會影響結果輸出,我們可以把支付後後端需要執行的邏輯放在這裏,比如記錄支付成功等
完整的交易邏輯
最重要就是 WIDout_trade_no
商品訂單號,自己定義的,當我們發送支付到自己後端時候記錄這個訂單號,等支付寶驗籤回來成功後,對比信息中的訂單號完成一個完整的支付邏輯,還要注意的是支付寶應該是隻能用form表單提交支付請求,因爲返回來的是一個form的代碼,當然你也可以動態創建form來發送支付請求,但我個人建議還是直接靜態form的形式來得方便
APP和網頁支付
注意APP和網頁都要各自通過簽約
纔可以調用支付接口的,之前在這裏浪費了很久時間一直測試都是報ALIN10146
錯誤就是因爲忘記還沒有APP簽約
APP內支付要真機連接查看返回的參數,注意後臺PHP返回給APP的簽名是不需要htmlspecialchars
,不然這裏會幫你把&
轉&
,這裏正確是&
,不然APP支付會報ALIN10146
// 注意:這裏不需要使用htmlspecialchars進行轉義,直接返回即可
echo $response;
//echo htmlspecialchars($response);//就是orderString 可以直接給客戶端請求,無需再做處理。
AWS
亞馬遜雲服務器官網
可以把在本地ssh-keygen
命令生成的Github
的ssh
私鑰上傳上去,然後在創建服務器時候使用密鑰對來生成鑰匙,然後使用microsoft remote desktop for mac
進行連接,可以導入rtp
文件,配合本地的公鑰來進行解析密碼登錄