1. 程式人生 > >微信支付開發本地接收非同步通知回撥【實戰】

微信支付開發本地接收非同步通知回撥【實戰】

前言

最近在除錯微信相關的介面,但是由於微信官方出於安全的考慮,對於呼叫介面的域名有限制。微信授權與微信支付統一下單介面在本地可以通過更改 host 的方式來除錯,微信伺服器也能跳轉回來,但是微信支付非同步通知這裡;微信官方強制讓設定支付授權目錄,且是通過 ICP 備案的域名,因此不採取特殊手段,本地是無法接收到微信的非同步通知回撥請求的,只能部署到線上環境測試

前置條件

為了解決這個問題,折騰了好幾天,才搞出來了,究其根本原因,還是對於 Nginx 不太熟悉。所以在此記錄一下。

內網轉發

如果想本地進行除錯,並且想讓微信伺服器請求回調回來,則本地必須要有一個外網域名,這裡我們是用 

Ngrok內網轉發 來實現;Ngrok 的配置就是將本地專案的埠對映到分配的外網域名,具體配置參考官網教程文件,此處不再贅述。

我的配置是:

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

配置測試支付目錄

前面提到了,微信支付非同步通知會對支付域名目錄有要求,因此,支付時的域名必須要在設定的支付域名目錄下。

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

mark

這裡支付授權目錄配置的是以後線上的支付授權目錄

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

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

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 的