|
Pred kratkim sem razvijal uradni WeChat račun in naletel na nekaj težav s plačilom prek WeChata, bil sem zmeden tri dni, a danes mi je končno uspelo. V tem obdobju bi se rad zahvalil nekaterim velikim bogovom za njihovo pomoč in z njimi delil svojo izkušnjo, dokler so še vroči. Pred uvedbo WeChat Pay, Moram iti na razvojno platformo WeChat za certifikacijo, o teh informacijah o avtentikaciji in konfiguraciji ne bom veliko govoril, tukaj je predvsem na ravni kode za izvedbo plačila. Uradna dokumentacija: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7. Ob soočenju z več parametri v JS bom podal glavno razlago:
Med razvojnim procesom obstajajo štirje zelo pomembni parametri: eden je appid, AppSecret, apikey in številka trgovca. AppID v js zgoraj je eden izmed njih. timeStamp je časovni žig, 10 števk, nonceStr je naključno število, znotraj 32 bitov, dva najpomembnejša parametra tukaj in najbolj nagnjena k napakam sta package in paySign. Naj vam povem enega za drugim. Najprej govorimo o paketu, tukaj moramo uporabiti prepay_id, ta parameter je številka naročila, ki jo generira WeChat, za to moramo poklicati enotni vmesnik za naročilo. Uradna dokumentacija: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1. Kot lahko vidite iz dokumentacije, je za pridobitev prepay_id potrebnih veliko parametrov, eden najpomembnejših pa je podpis. Opomba: Podpis tukaj se razlikuje od podpisa plačila v JS. V dokumentu o podpisanem algoritmu sta dve točki, in poudarim le dve točki. Ena je vrstni red parametrov, ki jih je treba po ASCII povezati od majhnega do velikega, druga pa, da apikey ne sme biti napačen, kje je ta apikey? Prijavi se na trgovsko platformo, da jo nastaviš. Po spajanju potrebnih nizov za podpis se lahko uporabi MD5 šifriranje za pridobitev podpisa. Nato združimo podpis in vse prejšnje parametre v niz v xml formatu in pokličemo naslov URL vmesnika:
https://api.mch.weixin.qq.com/pay/unifiedorder就可以返回一个xml结果,解析出其中的prepay_id,这样这个参数就成功获取到了。 Pogovorimo se o zadnjem parametru v JS, PaySign: PaySign. Enako velja za algoritem plačilnega podpisa, ki združuje preostalih 5 parametrov v JS po vrsti, plus apikey, MD5 šifriranje, ok. Algoritem podpisov je enak, vendar so vrednosti parametrov različne. Tukaj je ena stvar, ki jo je treba omeniti. Pri plačilu za podpis se uporabljata naključno število nonceStr in časovni žig timeStamp, pri čemer se pri podpisovanju uporabljata ta dva parametra Če sta vrednosti teh dveh parametrov v JS enaki, sta enaki naključni številki in enak časovni žig. Zakaj? Čeprav dokumentacija tega ne navaja, po mojem razumevanju so plačilni podpisi generirani z naključnimi številkami in časovnimi žigi, Nato ob plačilu pošljite naključno številko, časovni žig in podpis plačila skupaj, ko WeChat potrdi, bo to prav tako na podlagi naključne številke in časovnega žiga v JS, da se ustvari podpis in primerja s plačilnim podpisom, ki ste ga poslali. Če ponovno pridobite novo naključno številko in časovni žig v js, bo izračunani podpis drugačen od tistega, ki ste ga poslali, in prijavljena bo napaka: podpis neuspešen.
To je vse za raven kode, seveda pa je treba omeniti še nekaj drugih točk. Na primer, uporabni parameter openid je treba pridobiti tudi s klicem vmesnika in preverjanjem, ali je imenik za avtorizacijo plačil pravilno konfiguriran. Povzetek zadnjega stavka: Natančno si oglejte dokument in na koncu vprašajte druge, najdete lahko skupine za plačila na WeChatu, v njem je veliko bogov, sam sem se že srečal s problemom in se dva dni boril brez rešitve (včasih samo pogled v dokument ni dovolj), Nato je jezen dodal 8 razvojnih skupin na WeChatu in končno izšel pod vodstvom strokovnjakov. Še enkrat hvala. Programerji so skupina ljudi, ki radi delijo svoje znanje in z veseljem delijo svoje znanje. Torej, ko ne razumeš, vprašaj več.
|