近期在做微信商家券項目期間,微信回調的驗簽始終不能通過,來來回回查文檔、檢查參數、調試參數甚至都要懷疑人生了。哪哪都對,為什么就是驗簽不通過?
先說結論:問題在於微信的官方文檔和回調實際下發的body字段順序不一致。
我試了3種方案。
-
微信最新api wechatpay-apache-httpclient
-
openssl 命令行:微信支付-開發者文檔 (qq.com)
其中方案1的錯誤提示:
驗簽失敗:serial=[6AA7492A34586DA6D4AF42782A07F33D4379E95E]
message=[1643346572
zsKryvwcnulf38DUssvqHyKCM3bqduwp
{"create_time":"2022-01-28T13:09:30+08:00","event_type":"COUPON.SEND","id":"b73944d4-8ba9-5bce-8975-422fde973746","resource":{"algorithm":"AEAD_AES_256_GCM","associated_data":"coupon","ciphertext":"***","nonce":"LZQnQDfylJpO","original_type":"coupon"},"resource_type":"encrypt-resource","summary":"商家券領券通知"}
]
sign=[mTpDvPsa2IBv7/v/nWlLE88s12nnn9+cJqzuVPjDbjaBnOx7ZphnFayTSKqG3a/O+PT2G7MV6QKVtrjU7KJS7LihtQfntU3LEp8wn/2Dv229vWSLM3OXXJF52oZLmDy3xX4Mt56pSvh57XN4DbRUe3/p3PVFFMiyuGnA7oIAXlGG8egMR9+ksw1EtZDJw/flff1o4exF48WysXCbVIu6QdaiDS6daLHw5owltO+LAkZFXo9SVBPvx16/amuB/jh3zEX+ariAZ91jC9riB1yVh6PGqJ/jNfTth/KTZeE6nqr+bVFiyCA/QMSL2APGjXGj3XmsTt7vxu9dPJqxRt/+cA==]
事情的轉機。在反復看回調驗簽文檔時,看到這句“應答主體(response Body),需要按照接口返回的順序進行驗簽,錯誤的順序將導致驗簽失敗。”。我對比了回調數據的body 和接口文檔,發現了字段順序不一致的現象。
解決方法。格式化回調數據(body),跟接口文檔對齊。然后驗簽就順利通過了,通過了
通過這個事情,我們可以發現微信支付的api 文檔其實不是那么嚴謹。要吃透文檔,但是又要保持一點懷疑精神。對於上述引用自官方文檔這句話。應加上“回調接口的body 字段和接口文檔不一致,需要先格式化跟接口文檔的字段順序保持一致” 。
最后,回調的body(跟接口文檔的字段順序對比着看) :
{"create_time":"2022-02-17T02:31:39+08:00","event_type":"COUPON.SEND","id":"a31447cb-57e8-5552-bcd1-6e8fa0ba3d11","resource":{"algorithm":"AEAD_AES_256_GCM","associated_data":"coupon","ciphertext":"***","nonce":"zEFCBCPkeNVw","original_type":"coupon"},"resource_type":"encrypt-resource","summary":"商家券領券通知"}
《完》