微信支付開發本地接收異步通知回調【實戰】

訪問個人博客html

前言

最近在調試微信相關的接口,可是因爲微信官方出於安全的考慮,對於調用接口的域名有限制。微信受權與微信支付統一下單接口在本地能夠經過更改 host 的方式來調試,微信服務器也能跳轉回來,可是微信支付異步通知這裏;微信官方強制讓設置支付受權目錄,且是經過 ICP 備案的域名,所以不採起特殊手段,本地是沒法接收到微信的異步通知回調請求的,只能部署到線上環境測試nginx

前置條件

爲了解決這個問題,折騰了好幾天,才搞出來了,究其根本緣由,仍是對於 Nginx 不太熟悉。因此在此記錄一下。web

內網轉發

若是想本地進行調試,而且想讓微信服務器請求回調回來,則本地必需要有一個外網域名,這裏咱們是用 Ngrok內網轉發 來實現;Ngrok 的配置就是將本地項目的端口映射到分配的外網域名,具體配置參考官網教程文檔,此處再也不贅述。安全

個人配置是:服務器

http://vcmq.free.ngrok.cc -> 127.0.0.1:8080

配置測試支付目錄

前面提到了,微信支付異步通知會對支付域名目錄有要求,所以,支付時的域名必需要在設置的支付域名目錄下。微信

首先須要在 微信商戶平臺 中配置 商戶祕鑰,支付受權目錄。dom

mark

這裏支付受權目錄配置的是之後線上的支付受權目錄異步

http://pay.domain.com/wechat/public/

而後再加一條本地測試支付的臨時受權目錄,這個目錄最好在本地測試完成後,進行刪除。ide

http://pay.domain.com/testpay/

必知的 Nginx 語法

proxy_pass 後的 url 加不加 / 的區別

這裏列舉 nginx 的 proxy_pass 語法,是爲了下一步針對 nginx 的配置進行修改。工具

這裏訪問 http://127.0.0.1/proxy/test.html 測試 proxy_pass 後面的 url 加與不加 / 的區別

server {
    listen       80;
    server_name 127.0.0.1;

    location  /proxy/ {
          proxy_pass http://192.168.0.100/;
    }
}

以上 location 會代理到 http://192.168.0.100/test.html 即至關因而絕對根路徑,則 Nginx 不會把 location 中的路徑部分代理走。

server {
    listen       80;
    server_name 127.0.0.1;

    location  /proxy/ {
          proxy_pass http://192.168.0.100;
    }
}

以上 location 會代理到 http://192.168.0.100/proxy/test.html 即至關於相對路徑。


代理支付域名到第三方域名

知道上一步 proxy_pass 後 / 的做用後,就開始來配置支付域名指向的服務器上的 nginx 的配置文件。

server {
    listen       80;
    server_name pay.domain.com;

    location /testpay/ {
        proxy_set_header Host vcmq.free.ngrok.cc;
        proxy_pass http://vcmq.free.ngrok.cc/wide/;
    }
    
    location / {
        proxy_pass http://payServer;
    }
}

配置中的 wide 是我項目的名稱;
注意:這裏的 proxy_set_header Host 必須配置,不然進入 location 塊後,會提示 tunnel pay.domain.com not found

當訪問 pay.domain.com/testpay/create 微信統一下單接口時, 會代理到 http://vcmq.free.ngrok.cc/wide/create

須要注意的是,在統一下單接口,設置 notify_url 的值要爲配置的支付受權目錄,好比個人 http://pay.domain.com/testpay/notify,這個異步通知回調 URL 限定是 POST 請求,能夠在異步回調方法打斷點,而後經過 postman 工具發送 post 請求到 http://pay.domain.com/testpay/notify,看是否能夠正常進入斷點,若是正常進入斷點,恭喜你配置好了 Nginx 回調這一塊。

注意: 統一下單接口參數中提交的參數 notify_url ,若是連接沒法訪問,商戶將沒法接收到微信通知。
通知 url 必須爲直接可訪問的 url ,不能攜帶參數。示例:notify_url:「https://pay.weixin.qq.com/wxpay/pay.action

另外要注意,若是支付目錄中配置的是 https 的,那麼 notify_url 也必定要保持一致是 https 的。

統一下單並完成支付完成後,微信服務器會請求統一下單接口中的 notify_url,通過服務器 nginx 進行代理後,會代理到 本地的內網轉發域名異步通知回調接口 http://vcmq.free.ngrok.cc/wide/notify, 從而達到了本地接收微信支付異步通知回調請求的目的。

若是地址不在支付受權目錄下,會提示當前 Url 未註冊。由於是代理過去,所以地址欄的地址不會改變,這也是不能簡單使用 nginx 的 rewrite 的緣由。

若有疑問,能夠聯繫我。

參考

相關文章
相關標籤/搜索