From 95432431e59c340866803504be8bd747d7363f25 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Wed, 15 Jul 2026 16:29:52 +0800 Subject: [PATCH] fix(wechat): handle API errors instead of silently returning null h5_url - Check HTTP status code, raise exception on non-200 - Raise exception if h5_url missing from response - Fix description field to use .get() instead of direct key access - Remove unreachable return None Previously WeChat API errors (param errors, amount issues, etc.) would return None, causing the frontend to show: https://token.opencomputing.cn/null Now errors are properly raised and shown to the user. --- unipay/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 131 bytes unipay/__pycache__/core.cpython-310.pyc | Bin 0 -> 1887 bytes unipay/__pycache__/init.cpython-310.pyc | Bin 0 -> 6564 bytes unipay/__pycache__/notify.cpython-310.pyc | Bin 0 -> 1232 bytes unipay/__pycache__/payfee.cpython-310.pyc | Bin 0 -> 2730 bytes unipay/__pycache__/paylog.cpython-310.pyc | Bin 0 -> 4880 bytes unipay/__pycache__/utils.cpython-310.pyc | Bin 0 -> 633 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 141 bytes .../providers/__pycache__/alipay.cpython-310.pyc | Bin 0 -> 5782 bytes .../providers/__pycache__/paypal.cpython-310.pyc | Bin 0 -> 5144 bytes .../providers/__pycache__/stripe.cpython-310.pyc | Bin 0 -> 2402 bytes .../__pycache__/transfer.cpython-310.pyc | Bin 0 -> 5491 bytes .../providers/__pycache__/wechat.cpython-310.pyc | Bin 0 -> 6758 bytes unipay/providers/wechat.py | 11 ++++++++--- 14 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 unipay/__pycache__/__init__.cpython-310.pyc create mode 100644 unipay/__pycache__/core.cpython-310.pyc create mode 100644 unipay/__pycache__/init.cpython-310.pyc create mode 100644 unipay/__pycache__/notify.cpython-310.pyc create mode 100644 unipay/__pycache__/payfee.cpython-310.pyc create mode 100644 unipay/__pycache__/paylog.cpython-310.pyc create mode 100644 unipay/__pycache__/utils.cpython-310.pyc create mode 100644 unipay/providers/__pycache__/__init__.cpython-310.pyc create mode 100644 unipay/providers/__pycache__/alipay.cpython-310.pyc create mode 100644 unipay/providers/__pycache__/paypal.cpython-310.pyc create mode 100644 unipay/providers/__pycache__/stripe.cpython-310.pyc create mode 100644 unipay/providers/__pycache__/transfer.cpython-310.pyc create mode 100644 unipay/providers/__pycache__/wechat.cpython-310.pyc diff --git a/unipay/__pycache__/__init__.cpython-310.pyc b/unipay/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2c7c57f5fbbc74f8843e0f8772eee51fb05e04d GIT binary patch literal 131 zcmd1j<>g`kf>$n#Ss?l`h(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2BvKSjSXw@|+* twIIJ(zceqiAh8lg#m8snWtPOp>lIYq;;_lhPbtkwwFBudW&#o{3;=h#8s-21 literal 0 HcmV?d00001 diff --git a/unipay/__pycache__/core.cpython-310.pyc b/unipay/__pycache__/core.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3a0a8322d6c3ea9fc1a6bb56804805f7eeab06d GIT binary patch literal 1887 zcmah~%Wo4$7~hw7oreP|kCtA#vZ_j!thi@XRcRZ9dP$}B=F4icGpUXC;mpn!91_WS z2bu;Vr4NAwEhs{1^QsUukU$UpFZK$%c6!Ny8>fCVn{|>F=vec4zL{_4_r2H41GsYYq3NU>z{eB=wK%y-;Vp(*gvLrHIvSmjpD^8}I5ry*tl94hcAO)+F za#;gDgH+&EECQcJ+E+p$y9+M~1u2w2`Si1}#~k!2F)iv~TJaFycI%1p zm_C?(HxMk8MI@9ZB*LRo*nQrl_@Y@qM~FuT3UZh=4A*q9VT7HA;dm&p*}B^>h6B@1 zPF4iMtmouqzJyA3XShUg&GSovTdkS(^w07L?yc2{3ew;u!DnvC3W~^g{-b9Hoc1xX zRUij?mSwCU31_g1wIS&YIO||Nq#y-lrj$vsoPDE|iZm|O@kXgE>flnHAl1oHRF2q% z)g!1X>P9&(*@b$*kHeR=I?>$CX!~)ZNNfF0^xgOA^XzmVK#%69qwBxz?c6XO zFK}s5w*o@2Yt@Uo9}Hf=7A+y{Tclc}RnINzi9SX^?4s^^v^rEz)>hzC&%vZ*c`n75 zsNP(=(pIJQ=Tda@R{Zm9G&>Wm{TNMe?d{Ab$gSD?(dHuHU(VNv_e~XHl0Tcjh^>lA zM@^e0*C@=IX^%qwS8F(5)bq%sX8x>xxwp4>Y^;s4B8DdhJo>p)v$2Cg3&eALMG6%k z+e0J=-Z{u)(gkeTV-XDXU;qTW(gS-uXQhUsjhx;Oaqm%~*9L)tpxCSHF4p6~){K&c~axL#3b9Kl0@i#VHxiF(wujg$i; ze9vuTlH;HOd5e*D-6r-zKC!3XhNIL@b)+Y?GdcWU`#wBuUwnJHwQ(m&uz2o=#L(u| zhjC;4u(_{SDKi{kQhyKLe8IW}cs?_dOEuzWp;p1*4&sN(poi*~3}WeE>$DhB|5Mm& z`(pRk`R3Zw=+VR0y}QxI4CG;Ja}v@o$;tiA>kG{rQ%Qd62s$cMC8THk?J9TwK`?x3 z(!ek3CZ(oTVL1*}+lJyc7G!b)@X0%joMGf&A;?us7eS9rs^V47EX+_sB^`PBC(tk#`w6P=K#k;uH2|U{Ct&0_)IH z=6zAh!qi}@MUhJk6gooL9JC1QIUFxkX}wl;zfRCNc*nU*7Uu1NcX@vCRhVJ+qvZ4Q QF$hX4Qo literal 0 HcmV?d00001 diff --git a/unipay/__pycache__/init.cpython-310.pyc b/unipay/__pycache__/init.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6b274582e518f17ed9848dd3269f8d4eff9893f GIT binary patch literal 6564 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 Cye_H$ literal 0 HcmV?d00001 diff --git a/unipay/__pycache__/payfee.cpython-310.pyc b/unipay/__pycache__/payfee.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7efcd7a6776d5f099d70345fcceec12599518ba GIT binary patch literal 2730 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 YBS1t6@U!6O+{E5Lty=D?`&e-Nf1#%+!vFvP literal 0 HcmV?d00001 diff --git a/unipay/__pycache__/utils.cpython-310.pyc b/unipay/__pycache__/utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..764b5ef83fea122669446aa7121b06f1004baa7c GIT binary patch literal 633 zcmZWnJ#X7E5ap4w{87irP@qMp0+|F9@g4+4ffgOTbkicJB7@4YNrgutHP9_y^B|TY1FyYN@v@w%=AR(dbovhphtSV6=kmBlPI3;=mxQfxi_Krw&85wGD_al!6Sko z0t9(0@5D7+b2lss6%_^_Rck}cLc2EKh0m!r!Ts@E&o}GKxi_7|d2idU-aNU`uJEMW z#N4{8DjotDXezw9htrP~ zOwe?-uY>a#r^aIMO;uylw)8GrqO)7yjkqqDWs{mQ)MeIl>=CCp%=rs@w@^?z6Z literal 0 HcmV?d00001 diff --git a/unipay/providers/__pycache__/__init__.cpython-310.pyc b/unipay/providers/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c83fa959472f716492281dfb42ec38b09f79b3b GIT binary patch literal 141 zcmd1j<>g`kf>$n#Ss?l`h(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6v2KSjSXw@|+* zwIIJ(zceqiAh8lg6%^%{Wu~MS73;^xXXa&=#K-FuRNmsS$<0qG%}KQbnN-XKBv=># D%0V9e literal 0 HcmV?d00001 diff --git a/unipay/providers/__pycache__/alipay.cpython-310.pyc b/unipay/providers/__pycache__/alipay.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10d2407a71806987a4744cced6b5439e6836e78e GIT binary patch literal 5782 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 H^#S95I6L%J literal 0 HcmV?d00001 diff --git a/unipay/providers/__pycache__/paypal.cpython-310.pyc b/unipay/providers/__pycache__/paypal.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5dd3d23518b013db319be1e9d5832c063cfa8fb6 GIT binary patch literal 5144 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 LGP+Ec=^FbNljA6lWt~ym2#mT} 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 Cfxrj= literal 0 HcmV?d00001 diff --git a/unipay/providers/wechat.py b/unipay/providers/wechat.py index 55f359d..9e34947 100644 --- a/unipay/providers/wechat.py +++ b/unipay/providers/wechat.py @@ -172,9 +172,14 @@ class WechatGateway(Gateway): "Content-Type": "application/json" }) as resp: ret = await resp.json() - return ret.get("h5_url") - - return None + if resp.status != 200: + err_code = ret.get("code", "UNKNOWN") + err_msg = ret.get("message", str(ret)) + raise Exception(f"WeChat API error (HTTP {resp.status}): [{err_code}] {err_msg}") + h5_url = ret.get("h5_url") + if not h5_url: + raise Exception(f"WeChat API response missing h5_url: {json.dumps(ret, ensure_ascii=False)}") + return h5_url # ----------------------------------------------------- async def refund(self, payload: Dict[str, Any]) -> Dict[str, Any]: