From 9565e29ae0bcbe5f8fe89b443f319cd9418a19b0 Mon Sep 17 00:00:00 2001 From: jefferyzhao <375696853@qq.com> Date: Thu, 31 Jul 2025 17:39:37 +0800 Subject: [PATCH] first commit --- .DS_Store | Bin 0 -> 6148 bytes .idea/.gitignore | 8 + .idea/enterprise-wechat-payment-push.iml | 18 + .../inspectionProfiles/profiles_settings.xml | 6 + .idea/misc.xml | 4 + .idea/modules.xml | 8 + 1.py | 3 + FuiouPay.py | 53 +++ README.md | 0 __pycache__/FuiouPay.cpython-36.pyc | Bin 0 -> 2087 bytes __pycache__/FuiouPay.cpython-37.pyc | Bin 0 -> 2023 bytes __pycache__/WXPay.cpython-36.pyc | Bin 0 -> 4960 bytes __pycache__/WXPay.cpython-37.pyc | Bin 0 -> 5000 bytes __pycache__/app.cpython-37.pyc | Bin 0 -> 5883 bytes __pycache__/config.cpython-36.pyc | Bin 0 -> 1217 bytes __pycache__/config.cpython-37.pyc | Bin 0 -> 1049 bytes __pycache__/utils.cpython-36.pyc | Bin 0 -> 23587 bytes __pycache__/utils.cpython-37.pyc | Bin 0 -> 8213 bytes config.py | 42 ++ jpapp.py | 143 +++++++ priv_key.pem | 3 + pub_key.pem | 3 + test.py | 16 + utils.py | 394 ++++++++++++++++++ 24 files changed, 701 insertions(+) create mode 100644 .DS_Store create mode 100644 .idea/.gitignore create mode 100644 .idea/enterprise-wechat-payment-push.iml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 1.py create mode 100644 FuiouPay.py create mode 100644 README.md create mode 100644 __pycache__/FuiouPay.cpython-36.pyc create mode 100644 __pycache__/FuiouPay.cpython-37.pyc create mode 100644 __pycache__/WXPay.cpython-36.pyc create mode 100644 __pycache__/WXPay.cpython-37.pyc create mode 100644 __pycache__/app.cpython-37.pyc create mode 100644 __pycache__/config.cpython-36.pyc create mode 100644 __pycache__/config.cpython-37.pyc create mode 100644 __pycache__/utils.cpython-36.pyc create mode 100644 __pycache__/utils.cpython-37.pyc create mode 100644 config.py create mode 100644 jpapp.py create mode 100644 priv_key.pem create mode 100644 pub_key.pem create mode 100644 test.py create mode 100644 utils.py diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a25e5132d1b687c919209306da8518e3d8ccfa7b GIT binary patch literal 6148 zcmeHK%Sr=55Ufc;9*PieUWEMt1D?FDF&?}L9`qJXj4>KbKm+Esckvhe1;57c(dwQd zZ1!;#(QfFec~sA%X4u&Q;JSY`jA!JABaRCr-ZBw&+~TfyCY3R{>6tXhT$ZvwGwdc7JgXC~`>ALqI3)i)HTSI) zzpv|<2aPhTt{&w^I>!Z0sgu_cWZ8Oa@R)mOS+iw5|678X7nm1SFYk6x*F>v$q?g!iAUDZ>_ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..a2e120d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..4adf23a --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/1.py b/1.py new file mode 100644 index 0000000..5880702 --- /dev/null +++ b/1.py @@ -0,0 +1,3 @@ +from utils import * +from FuiouPay import H5Main +add_payment({'pay_amount': 0.01, 'id': '520103200111013211', 'sh': '0001000F7152040', 'base_company': '1', 'name': '王治轶', 'transaction_id': '2024112022001473261446621310', 'payment_items': '承包金', 'pay_type': '支付宝支付'},) \ No newline at end of file diff --git a/FuiouPay.py b/FuiouPay.py new file mode 100644 index 0000000..cb492c5 --- /dev/null +++ b/FuiouPay.py @@ -0,0 +1,53 @@ +import json +from datetime import datetime + +import requests +from Crypto.PublicKey import RSA +import base64 +from Crypto.Cipher import PKCS1_v1_5 + +# 使用公钥加密 +def rsa_long_encrypt(public_key,msg, length=100): + """ + 单次加密串的长度最大为 (key_size/8)-11 + 1024bit的证书用100, 2048bit的证书用 200 + """ + pub_key = RSA.importKey(open(public_key).read()) + # pub_key = RSA.importKey(open('E:/YinJian/银建支付对接维护说明/富友/fy-enterprise-wechat-payment-push/pub_key.pem').read()) + pubobj = PKCS1_v1_5.new(pub_key) + res = [] + for i in range(0, len(msg), length): + res.append(pubobj.encrypt(msg[i:i + length].encode('GBK'))) + return base64.b64encode(b"".join(res)).decode('GBK') + + +class H5Main: + def __init__(self, sub_mchnt_cd): + self.mchnt_cd = "0001000F7152279" + self.sub_mchnt_cd = sub_mchnt_cd + self.url = 'https://aggpcpay.fuioupay.com/aggh5Gate.fuiou' + self.notify_url = "http://web.jiyuankeshang.com/api4/paymentCallBack" + self.page_notify_url = "http://web.jiyuankeshang.com/api4/page_notify" + # self.notify_url = "http://172.16.6.15:3006/paymentCallBack" + + def unified_order(self, order_no, total, description): + param = { + "mchnt_cd": self.mchnt_cd, + "sub_mchnt_cd": self.sub_mchnt_cd, + "order_date": datetime.now().strftime("%Y%m%d"), + "order_id": order_no, + "order_amt": total, + "page_notify_url": self.page_notify_url, + "back_notify_url": self.notify_url, + "ver": "4.0.0", + "goods_name": "云学堂年费", + "goods_detail": description, + "fee_type": "CNY", + } + pub_key_location = 'pub_key.pem' + # pub_key_location = 'E:\YinJian\银建支付对接维护说明\技培\jp-enterprise-wechat-payment-push\pub_key.pem' + print("======================发起支付====================",param) + # 加密 + message = json.dumps(param) + encrypted_message = rsa_long_encrypt(pub_key_location,message,100) + return json.dumps({"message": encrypted_message}) \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/__pycache__/FuiouPay.cpython-36.pyc b/__pycache__/FuiouPay.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc38f7e3be117d2484dbd36b2e15128014e7cbd0 GIT binary patch literal 2087 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 bS|iFtOoacfUwUGu(uwPL%6DpJx0(451eF8J literal 0 HcmV?d00001 diff --git a/__pycache__/WXPay.cpython-37.pyc b/__pycache__/WXPay.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..805c9a844201910259a264068ef4c3c8940a34fe GIT binary patch literal 5000 zcmbtYU2GiH6`uc{on8Ot$4NlcO)1T$_&2t3AW3mH4k;9qVz(iyRMW}au|4+g&gRZ+ z60gP;k^!}-K-KaPK|*bnK&dJM66z0u(x*Q3v5)i8hhisrqA!&yUefQ}@lTutwJNio zGw0m@d(S!FIoF4qnk)&A{`X6hH@8aCKS)@6R4|X?4gU(lBqo=oQu>ukvXGUMBED)# z6<@8S;j5JO32LX7jY_7Jk%`yJW+hw73SKW;m0T$&c)6S}k z+*)ZXwXODRU+<@ux2%tCmbcQ_m2IVMXqRQyb5dzL%dtGZ9gj(@i8VhbvE~J(w1dgx zQlaGr_9KlIJ0f1)_vXP@n}2VI4R#*@LT<1OM1UjT_^CeJFonJM#1bq^#J(!ETBvRc~M)EmgIRg(ie?b1*b(BaMGg5tR)$; z9%W-~(TepY8Le|HhcY8Ju=o5}eFs*v{NeAHuYP##^%s|4dU@sjkFS6H*2=|~mS0?I zn6oo;)7>?%a!a%2AHQ>#X63syyY|*Aw~tny6r+t}(t~$AD;Ixr?U$FYz4qM7Po7WIK#_qD+M)b8X@z!$XIbmKfB)-vb<(ds?mN{}H-7OuXlLcsE1zDyuzcl@D=%NZcJ+gm7vH>o z<%5+AFP}Pc9DiNdvd6K9(Ca$qxzkS6RdePlDDA4%!|78eo;mK|JmwN}%8P88dpjlx z?*)-$Q!!*y7O!H;nw*#0WlL_Ax5|7M>esE9cDioGM<7Jfq8urVtV$I&s6^VL9xK8c z4RF$8hCvcGX~yaz>`>UC#mG+eSceU2V-0g|hE0*SIKj`FQgT8YJdYyYM5LJr`512@ zLQCPTL}+2+1bI8Sg2A^?0RT+m+lbI!c?S_XW^u?V*$FYp(~(S`n-s^g2PL5Z!Hq+> z2W2ka^@rU0QM_R0?Rz zxpUs>;nTx|{lf!8`}PgE{gaJ>=_sm&5BK!IS-LCkboV*WKkrw&&z$LYgG$fYeLXOp zo`^fu&~YO_sD?e$gN;7wg-#f+d&ZxuJJne)oOY^Hq7#Pdr*33%MWAPeZ_*2=uWNXvqZ;w@KNi$ zoLJQ$@+aqP;i-54OEW-iP&vkF&nPhz&XkM5V5Tz72WDSXm~k-! zwAEN9))y3Dv=(aus|lHbzVkXW;SnMxMJCHF$VY(XC^w>PWJS5f+!Evkc|ODPtm$<` zsW>C3A*fFDQg+^q^0A4LmH8}dVXdr<)`q(FnA&ZLv!Gi=&uyroakgK|bx5q^qB3t` zbvt59tgd;c1@*159$ReZOX_?Mb-Uu+42`EOsInC2U`6+gC2Dc(B%+@l1(8!uOt;QC zzz^sc&DFd_J>k?)+XD4_++KxWzm{aC2XXY1K_Md)ljMVXWW%hO2Q~8haHdI)d7;bw z8d(|tDwP;cC8$@U#0p)n>WTi1Ew?~8Sms2|!9;Rpw5NxhgVYw%+X)g&KiDxZr{FZB zM#_xVfdKh^NtVtaLBW>fv4Wl$FmM)B62qMieAfdaM+gB^NsAM@zHirSHIKVahzdZo zABEVW(%qZL_H7pSdG^2*mU_O%4}F(bK+Dmj#sjHg)vNxb?=d^z%;Vh$%7N>Y!$aNc zU2f2V8~X95#wV;s#}_zXB3q5Gz(LBs>(Ej4%!EPpkxsxo554H%_a=^Z4L5e37%d(f znK(XjvcD@$Sh|qP^!E-7cQ!J@tq$&PH0^${8dP16LQ^VIEO4Sa_fj$PD+otUrM6nT z=5_~ne=hGXD2;qEK%_xfnIP3Sjnt#*fcp)xtVY{3;-tsJ4SnIzG}0H0A+2gOZB&9Q zw5Lu>){q*2;@5Z%Qlil&6P?v7wGcw!Lx9SrU~m*yRfKC8AeJkFlmLLlpg2UeR%#O>aOY@ja5#%F4Jaabd`pbNy|4yg z^lr0-q-m4B51?)MAc&-BvLcIDQDj3^lvd3`%(dhlh_m;}ma53TiiMEVDmS*=#d0>` z5*?4grN4neG$2%x1S-iuB}4QpHepaEGNbHb_J716 z>oyD`>}eO+vqfOfR;((AvTc{Lz@F^_d-5|)C~X#q(;*P21!$B51_4*s5ohOE$?6*# z8hGfTq5T8B`~mC|$+gfI#XnvkvNtXLCh>H{t0=>}s6d#L&@F)q?;%35n)iWxN#Nl9 zG|)aG6jJygks%PQ@gd@eiENHSd_T$rKCPm|-px9u?Bk0NfXb${wXgBSa1pA#>-Ha`I6kM~OT}gmN?f zH6q7|e49uo5poj#ILNB!^Czg_E>6$CLlsXF*+OL9%lR0In-!U~tvUF*%6^DeA=#(| z*S^!qHynJABHX*<3sk?JW>e}x8K`jazkr$h8C@55;wrsUnpakN6+BWtQLcg4BDheb zP$CXaL$VEy>2NZn*+|8;G(|^JV#H|03`)f58ptwCdY(qkfX8K1@Fx0X;NY1hBpH#3 z#67!ci4@;DAys=dDay@S{Liv9kBfVwJ<2mPhO=M7b(AjW<9O$DKgvBLos_D|Gg3@> zZ+49EISlID^%BeVYttSlXijtyk|^+of$KXF!X?Fwg3QOU`_=1!|IeE@Z`LWDzy9{G zman|9{Q4W$-&k8%*9uMCM4h-9B-yk3?D5g!)1wpOevp_?K6PZ&eysRp zV$^FG+T$6tP1v04-u_;3F zr)gSRD4(D~jdWv4#;b~5B&LHHX-CdfV%lqE*;?5_{G!cU>77voJNb@yLQBNI7!a>S zDon@nEM^G_;3QaEUi@~+&G@A}*;q3INn=N9XLk-TRxq&?yXqjk*@D7<`Au&!Pg&P`3uZTkHO=;uqqA);VHA!x@j5;T+tHS#HrL~fcX|otR%{v4D(a!I7 jB#C(-J={Z-tcH|vJ2`72mrLy(PYYLz=M}pzW6e)AT_?+mG$vuwRSp_z&n8rXTt{cO_XdrX}sPpDKIL z-aUICd(ZjZ-#Pc5$YxUtet&*>wEXRx73Ht=(EAxEJdDftn4)lnv#L^KCabBYTGLFe zrki@rFbziU)M~62H{-IbRTHO4r&p7;q?wdDqna{P&>7XVnU?pAnQ@qtU14UBu{Z0G}Qomd3zu4FB=Qm4zLF#Ym>u=?^ zN&SS>-`@Y81N;uD-{WNYoeS!#Ow6OkUS8w}G2^=~Xt0(ss}v7yk{60bXgpfA{e>_t zoadU3AA||va922`AT;b}>mmr_zT^9D-7B(CpL*iSS=`w{2;*B%pR$)`HVfz{OwCSD zJvn{a`sVaAr;E%S^P7zZ8v9lW-8o+1+Eu@mnZyuc=_%h4-{7J4*fgq!@tPA<>fA5U z_s~zrMVOhw<$DlIj|R#-TU9w*W6MgQwc(#-7U*rZ!nnG?#F4S7Xjwa_J*_;Wcw$_Rehn__v*_SJq#D z@8hd)bl&@L{grn%u3lb$>FsOpU0#3Vl`|(#;r}qc*bxok`p)4+r&O_n!Z>RF^WF|p=c`0u!OvHwuj}Jn1HsG+VXhczhsZTe;>!g(k(mtm#gq9 zR%ko&odMsSgzuo~`%XOvuMPN4gYU?ytMrb?>NrIq^DLLE>;1SzghfE*-2a_B)21T-F>P*!6+vBr3E0=5g{WXol= z;we1qK?0>TT4pB5{zlv2*}V$xjOU;oT2RF&Jii=6kHc-Ft+q8jGNC}CH^@;b$E4f^ zsq^uR3HqKOxta>npQlAT#&=&#mf0FwdGoyRZ;q9@(Xsdh-{VFLF}sjLSa}6_Lpbg) z#rV1SbxU#Yj5%>n|F_MfEu$Hf58vO+z=fUj=R41T)OqvLwf9%dbRcZ*Sbks!P8gqk zYHDhFcD6~YaP!H_tCPy99 zsFf<9)zm#lkKTLVeMcX-_wMEp4f4S|8&}?4zj&eZ(%QAlA2x~G1_$oE{ldnpFK*H> zo5atXF%p!=6cb^J7DzOfTo|ER_Cs}kF4R4{=7f6LFSkOy(x}wL?bISE4&xTBp(9k9 zByl&1dq{kV1l0_)UGrIP;MDwP61w#t{HgQ9^PAs$O$LF@zd%*Y$>kcYWn!-|#vO`e zq3(Rwu9_p!ljYR|w~VDsVZ-nnRW}H;Ww#3Qx90hhRe`0-)w+$yZv_?M*gVX`A0n_k zXR)Wr*_>Owuc|JF>4E2n91@{c^XE)$vC@d9xC>t-ry~wf>B}T`qSv8qSh*h+{YN1b zjhKSMOoF9Y4st|Is0pwwY3bbvi{U9H@8gnN1~p@{hIj})wT#IC$xfeAROtFK>Fan{ zD)h*BE9Z!)7g>Z3x;+8-gECqfP#2wMPth`;wu;;a+VA@>SuGP z-uuq$f((Ti(B;GE26PGAdv&W;_Z%5%`m@sTnvxhvly9T3)EJzV3@|F!DA*uq5TPOH z5HaEz0frlr5Fk5FC&2UtwlN4rEYM_2PvKb zEwUA4U|oxC4^Y{j#jtLg)oQ5EU}DlhVcg|b$rfC$b5X>M#6c2wkvIf_NcOMSR5-NF zV8!%y*X*YbkCGtti3dr1mBeup^M z;mG&iu^n16J}hw(VTJ-DlOd6Dgv7ztgbb{+lngXuzz*f>dCYWIo3j5c>}=27$9ve3 z%)S28_d9Q0iufC8?#9&@#Un7LI6*?DceFBO>W5T^NL>*%)2O3lOYA4{PoamzUw*tqos1MaLGLm2a~_vZ>mq_)s!N^`1a-9l2#&CE zm1GQ;jtfwvmaQy7vAXzwFiM*GpMg9_c#OVD#;wlk{WU3ii%A{ zbaIg&Lk7`Sc>hU$G;9v&v||*#;49Yj`RuY0 z z8;%flu}KNgCgpbGPKYKEX6Hw*UHi@NqT#o4X!=e$pKHH*t8?Ke(R`Z3$Ak5^?GB2= z1NnCUP(eI^Ry(E*l(w7MrstMjhg)^Q9T93cbO`mprTszRoDC%No5Q_I<;8MTFbzNXzD6m6PgvO}t&?E|SS!ymS|L}+6ow0T;XYQ_SGcKgM~eLeF8@V~ literal 0 HcmV?d00001 diff --git a/__pycache__/config.cpython-36.pyc b/__pycache__/config.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..302ab665f380459e314242a357983c064d8c3f6f GIT binary patch literal 1217 zcmZ8h&2Jk;6n7kd#7>hoNx%50lxqaGXJ&VHW+Q|WLJlA$L`|W}T&&r7vsuRuIDD&cwq=b(cCIhBJMH3NB-hgmfX1yz8eDndz>psdO;r{~ zMO}dfwE&B15w5DMm~#!TsU=ua%do6gU`1Vr>*@yFfSYg&Zo@0^>UTwT6JFcTt-U^G zRTD$2cep-G!hK1^lojuKWciVhF+2(ZXe*gXLzPHsr zy8pr0Bp-gV*^J-Y*>XkDJ>o`{DakIbR;A#cw2Tv>P2jtPdsaA<7~e1*_`t`Dl+e2C z)ESX=>T-44a~)wAbF7s<2dp9~(~baSxTHL!RDgAT#=U@APgs#@xUWM7QV42&K@FFV z$Cx(Ac*K!ZNCP$mMgXg8E6h~mdB$Ux8WuW0vwct_yii&aa$-X28DLmdUoZrS^)8tp zlr+c~?uQyr3W$SkO5X^<3G@8_G{I#DOwiEJdgGb~_@+2_eLob0S}UxzPR2;Z zlkMkvk^|?~Bb;hvENI{kImeGScRrIrK7-i|3J7b(;WC=1-#$G5;WNaiUpzkh^7Q=k zZ-$jD{DSxVmru`r|MB^+zg=)o9)Ev!`Y7{OFca;wpT5EZXJ0?4ot-{>^60_t+O0{s z*@W0Mo0CeQ2ez5$G@6u5+)r9CDeZ4>-QB)7DeFVqOEFM6cAEdj@~vc2PV`ArC&{GR z8KH8zp6^>@TgMifC|E?|1%KExai?QVI^~y;e<`$>6#|>;R%eiv$WmSkRkShjFwNLf zG`{Gdh!)*qG>z({)wU;-QaGHlXpyb-haKA-#QpT=T>lQ9$p!q~XuP|JcMYG>_LF{V zU~405BAwQ7-!4XL$#4)gOxz1whxO!SGWS+D1}yb9{(^FYHxUZ6g?wQKM*(dCZRTCh KJg%n$bN&JKt8wN4 literal 0 HcmV?d00001 diff --git a/__pycache__/config.cpython-37.pyc b/__pycache__/config.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d14404606de39b9ae156f0c07684a860cb56ba0a GIT binary patch literal 1049 zcmZ8g&1)M+6qjXvSaR$ncE2tKA9^uG^6u=;euz-)7#$k08{)LVgFwvAo7Jv9b~oBx ztJ0~^n$l2QN<+w@rBK?^o?NIgI6CD2*lR4s`U86JteQib8Rqx)z2E!2w=>M#URfz; z(&61|{hiBXUd)|WP!M)otgs;fG9&{FWC5}y3yWkCawG?Nl7|8*K#>$-i7Y{hl*B4S znJkOgHCQGqaE+|O3b_ueKnuZ`{Bnc#LG2k{J z2{aYyvTddsOl3=)6UM4(+PWlju5-?nc{PR0w)$E%iEEl7c7v?0+;zfMd*pygo!f^; zbZ`H&9giIz-s@O(p+yGglrpZ{$YA0O43laSOZ%ysfdON#Nm!JQN?{+zhUioPj@QAwIQ1GNg z8S~>P{VX`6xjrwfQ0AR9niOc@cK9$U*m24xd0|ssKko8o==Y;PGyQZ&bNDBHTlHGw z(Dm-P)N9OsIG>E4O&_0Lj-O6WFQzBIy&RuSAN_iDdNzG}(wIK_V)FAvqa9Slj(9)l zyCJU(ICE%J5&zi}(Mk}9PJ{WL?Y64HFj>0Q^Fg%!C@(sN9|*`T=CZj3F>}JE>&+>+ Fe*xBLOQ`?= literal 0 HcmV?d00001 diff --git a/__pycache__/utils.cpython-36.pyc b/__pycache__/utils.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..195164541ea9668e92da9863fca2cf435a66dd9d GIT binary patch literal 23587 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