瀏覽代碼

版本管理与退款

xjconline 2 年之前
父節點
當前提交
41c48ae27d

+ 25 - 0
src/manage/controls.py

@@ -33,6 +33,7 @@ import xlrd
 import xlwt
 from xlutils.copy import copy
 from xltpl.writer import BookWriter
+from weixin.wzhifuSDK_V3 import refund_order
 
 @ccc.cache_data()
 def get_user_info(uid):
@@ -1056,3 +1057,27 @@ def import_article(**kwargs):
     """
     """
     obj = cm.Article.objects.create(**kwargs)
+
+
+def refund_out_trade_order(**kwargs):
+    """
+    """
+    _id = kwargs.get("id")
+    signup_order = cm.SignupOrder.objects.filter(id=_id).first()
+    if signup_order:
+        out_trade_no = signup_order.out_trade_no
+        transaction_id = signup_order.transaction_id
+        total_fee = signup_order.total_fee
+        amount = str(int(total_fee*100))
+        print(amount)
+        result = refund_order(transaction_id,out_trade_no,out_trade_no,amount)
+        if result.get("result_code") == "SUCCESS":
+            signup_order.order_status = -1
+            signup_order.save()
+            return "success"
+        else:
+            raise ce.TipException(result.get("err_code_des"))
+    else:
+        raise ce.TipException(u"该订单不存在退款失败!")
+
+

+ 3 - 0
src/manage/urls_backstage.py

@@ -58,6 +58,9 @@ urlpatterns = [
     url(r'^baike/detail/list$', views.BaikeDetailListView.as_view()),
     url(r'^article/push$', views.PushArticleView.as_view()),
     url(r'^article/import$', views.ImportArticleView.as_view()),
+    url(r'^version$', views.APPVersionView.as_view()),
+    url(r'^version/list$', views.APPVersionListView.as_view()),
+    url(r'^wxpay/refund$', views.WXPayRefundView.as_view()),
 
 ]
 

+ 108 - 0
src/manage/views.py

@@ -1577,3 +1577,111 @@ class ImportArticleView(cv.BaseView):
         except Exception as e:
             cv.tracefail()
             return cv.to_fail(e)
+
+
+class APPVersionView(cv.AdminView):
+    def get(self, request):
+        """#赛事详情(平台管理后台)
+        @id:1
+        """
+        qdata = request.json
+        need_params = ["id"]
+        mse = ccf.check_params(*need_params,**qdata)
+        if mse:
+            raise ce.TipException(mse)
+        try:
+            vals = ccf.get_need_params(*need_params,**qdata)
+            rst = ctl.get_detail_info(self,**vals)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+    def post(self,request):
+        """#新增赛事(平台管理后台)
+        @name:"赛事名称"
+        @content:"详情"
+        """
+        qdata = request.json
+        need_params = ["version","android_version","android_url","ios_url","force"]
+        mse = ccf.check_params(*need_params,**qdata)
+        if mse:
+            raise ce.TipException(mse)
+        try:
+            vals = ccf.get_need_params(*need_params,**qdata)
+            rst = ctl.add_model(self,**vals)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+    def put(self,request):
+        """#修改赛事(平台管理后台)
+        @id:"1"
+        @name:"名称"
+        @content:"详情"
+        """
+        qdata = request.json
+        need_params = ["id","version","android_version","android_url","ios_url","force"]
+        mse = ccf.check_params(*need_params,**qdata)
+        if mse:
+            raise ce.TipException(mse)
+        try:
+            vals = ccf.get_need_params(*need_params,**qdata)
+            rst = ctl.update_model(self,**vals)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+    def delete(self,request):
+        """#删除赛事(平台管理后台)
+        @id:"1",多个逗号分隔
+        """
+        qdata = request.json
+        need_params = ["id"]
+        mse = ccf.check_params(*need_params,**qdata)
+        if mse:
+            raise ce.TipException(mse)
+        try:
+            vals = ccf.get_need_params(*need_params,**qdata)
+            rst = ctl.delete_model(self,**vals)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class APPVersionListView(cv.AdminView):
+    def get(self, request):
+        """#文章列表(平台管理后台)
+        @name:""
+        @page:1
+        @page_size:20
+        """
+        qdata = request.json
+        try:
+            total,rst = ctl.get_list_info(self,**qdata)
+            return cv.to_suc({"total":total,"list":rst})
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class WXPayRefundView(cv.AdminView):
+    def post(self,request):
+        """#微信退款(平台管理后台)
+        @id:"订单id"
+        """
+        qdata = request.json
+        need_params = ["id"]
+        mse = ccf.check_params(*need_params,**qdata)
+        if mse:
+            raise ce.TipException(mse)
+        try:
+            vals = ccf.get_need_params(*need_params,**qdata)
+            rst = ctl.refund_out_trade_order(**vals)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)

+ 1 - 1
src/tools/split_table.py

@@ -205,7 +205,7 @@ def insert_data(record):
 def split_table():
     """
     """
-    qset = cm.Match.objects.filter(id=14)
+    qset = cm.Match.objects.filter(id=15)
     #qset = cm.Match.objects.all()
     for obj in qset:
         match_id = obj.id

+ 25 - 0
src/weixin/cert/apiclient_cert.pem

@@ -0,0 +1,25 @@
+-----BEGIN CERTIFICATE-----
+MIIEKDCCAxCgAwIBAgIUTPnTSm+ZFAqRoff0I8CzJ9ZxlhQwDQYJKoZIhvcNAQEL
+BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
+FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
+Q0EwHhcNMjMwNDEyMDAzNzE5WhcNMjgwNDEwMDAzNzE5WjCBgTETMBEGA1UEAwwK
+MTYyNTQ5NDUwMzEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMS0wKwYDVQQL
+DCTplb/mspnmt7zojrHkv6Hmga/np5HmioDmnInpmZDlhazlj7gxCzAJBgNVBAYM
+AkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAPM2x3yr56pUhO+pIQ/OBWP1mXVf2aW5wXrFhlANJI+DYeUdrBn9hFT2
+aBcEwPd5ljGr2wTG4tINvnxC2mxX8WFVD9Dl1eJI1djMZxnxtM6OKtFb3EvNG6Dm
+9KbpqfQgn0lfALNLMcFFXfMr7cX5igqFxCJuRVwuADyngE48CazRleNDyWUFG060
+JVfSk+sr8+Nj7tYfmSkSFrgoTXZppAl9hXnH6f6KZ9CKGtfhkMPG7k2r0u/4ciI6
+mNYNkQOgOHTCRAvNCFpEE4s+hYkbHbnvwJw+Hs57kT2sEhZOfR9/TKpxihWzUoOs
+tOeabCy5IIoOfU9CttPOsmBotrh72bUCAwEAAaOBuTCBtjAJBgNVHRMEAjAAMAsG
+A1UdDwQEAwID+DCBmwYDVR0fBIGTMIGQMIGNoIGKoIGHhoGEaHR0cDovL2V2Y2Eu
+aXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJDMDRC
+MDZBRDM5NzU0OTg0NkMwMUMzRThFQkQyJnNnPUhBQ0M0NzFCNjU0MjJFMTJCMjdB
+OUQzM0E4N0FEMUNERjU5MjZFMTQwMzcxMA0GCSqGSIb3DQEBCwUAA4IBAQA4qKB5
+l1YUnD2M31nQYANodF7KnABRPiBG1zRcvarGsKFLG/ocdyqMb3ZdbxQDTLFhnrrT
+x8V0FsQASVmRZ65FeERI9ZREQkkYhYJ2wrC76/qPi9d9mC2g5wgpsZ4USSDm14fG
+0adZax15x5ga06qtj+Zzyh059YLGOX/pG80i/bwEGF/eyBXg0JbWpee/hh34rkFY
+yaUf36nS9vzAszVEcQGZfiyYtypfMtwnc0xcx0YqO2qymkmR9lnMYkXq2pIIkTWz
+Q+S17pK4Ca6DeXRmWH3qLpGn8HIcm2P1oc0sFh/RLdMNZXiXAtNH3UrRvJIM9/ml
+6T1MF+A/toOvpIdH
+-----END CERTIFICATE-----

+ 28 - 0
src/weixin/cert/apiclient_key.pem

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDzNsd8q+eqVITv
+qSEPzgVj9Zl1X9mlucF6xYZQDSSPg2HlHawZ/YRU9mgXBMD3eZYxq9sExuLSDb58
+QtpsV/FhVQ/Q5dXiSNXYzGcZ8bTOjirRW9xLzRug5vSm6an0IJ9JXwCzSzHBRV3z
+K+3F+YoKhcQibkVcLgA8p4BOPAms0ZXjQ8llBRtOtCVX0pPrK/PjY+7WH5kpEha4
+KE12aaQJfYV5x+n+imfQihrX4ZDDxu5Nq9Lv+HIiOpjWDZEDoDh0wkQLzQhaRBOL
+PoWJGx2578CcPh7Oe5E9rBIWTn0ff0yqcYoVs1KDrLTnmmwsuSCKDn1PQrbTzrJg
+aLa4e9m1AgMBAAECggEBAKiZRcqoBG1wL8NPlCq3n8b+f0X9jwwya+xmt0gRBFI0
+Oo2wdxiBRNX9BoVGd1pWwAZo4ug50wzYGD9dvLq0cBEP/WnLmexGn2+tqp8yjitO
+JGKDcoBdjBSLZfe7LWSdpK4hHIQt0SzwoEMtJaRC6y2GM0PG+2/+N43Uc75IIlDY
+ky1E80kJxxMfmSMWSanMdfcWIIqoSxXKkqGi6JXgugDSWpOXs0+dYE9TNmXwJ1sI
+O83Vg6OTBV8y6EthaVDonBvzYDfhO80A0Sa33nwpsSKWIEHFUUbEu1yD+dkcS5r2
+cgxQleo1VeQCMBe/18fljL2rlemTUgi4VmUtruZV+eECgYEA/wfpLWpsZt28qp57
+8zDVm42MkxY7XgrA6FpVZu8LDdLLFTX9YYoZd9Dtwte+jxfgMfF+YSiN4RjMj4q4
+krhL2Wa/lJDK/Xacn/xUQPe0umUkasDt5RJeelkb5Zd9YyBYm+GvhOjgxERg0XH4
+1S6SxayjIaobTxlqjV0ReWofaHkCgYEA9CNfhRKw6W1OTP4k3JTdR7hyOCY9TyZs
+C8ioqmCSQQcKXoPesI6JybSLhmuOx0DUMqRrx+iANHcUASIer4nwiB5ti40CTbTx
+WjzQcR4RrqbQj1EI7Te/1K5eyY6Wj93Qjh0o5rmjP/zQsoVEup+zelcgSr1Nyt5e
+OLztJ/McJB0CgYB1VGdjnI2ouaTd/jHaTYJIoVOmK9k+R8Y+X6jgxWMZhfwmkwMy
+h7110SpBtM4XuQ1NDORuwKCdibI668BEyAMlTs8fA4pQF+yw8f61MQD1rCiX8JDC
+DbRnp21dMFfgbfY2KRt+E0GtKiQ816l6MoYV6XnXuBH+TxwlU0cBy+ANSQKBgFZL
+To8d/TR1M3EZf/QMFm8sbgsU0STyAszjf2LBwdCEaZDg8czchS2ryImZ6Rza+GZy
+IbrGntJsqMCBy/DmRAQJJVVnYUIQTCNGTbM+GqfuRNfzn8EhrIfDnrOF2AhAMmCZ
+RATR5zdN6ILBgnqoymra8woYAbBMi2douDcfwnmtAoGAWv2ejDz4muQym0ex/L6W
+BnuVh+A77XfxrGQvy4lUqxcPlsxkf5bT5uMTWp4DHzhmNJN5zvJzjw7vDd2DtIGb
+bnd0ew5HpxoTwpUybw5Gc/m75/w/Cg3o0qCsTUEKP9MT4kgCKZBdEL58KA2oGPa2
+SI5DzGVp3OIG6CDAOC+feYo=
+-----END PRIVATE KEY-----

+ 7 - 7
src/weixin/wzhifuSDK_V3.py

@@ -76,14 +76,15 @@ class WxPayConf_pub(object):
 
     #=======【证书路径设置】=====================================
     #证书路径,注意应该填写绝对路径
-    SSLCERT_PATH = "/data/web/m_website_dev/m_web/weixinpay/cert/apiclient_cert.pem"
-    SSLKEY_PATH = "/data/web/m_website_dev/m_web/weixinpay/cert/apiclient_key.pem"
+    SSLCERT_PATH = "/tmp/wanzb_v3_api/src/weixin/cert/apiclient_cert.pem"
+    SSLKEY_PATH = "/tmp/wanzb_v3_api/src/weixin/cert/apiclient_key.pem"
 
     #=======【curl超时设置】===================================
     CURL_TIMEOUT = 30
 
     #=======【HTTP客户端设置】===================================
-    HTTP_CLIENT = "URLLIB"  # ("URLLIB", "CURL")
+    #HTTP_CLIENT = "URLLIB"  # ("URLLIB", "CURL")
+    HTTP_CLIENT = "CURL"  # ("URLLIB", "CURL")
 
 
 class Singleton(object):
@@ -169,6 +170,7 @@ class CurlClient(object):
 class HttpClient(Singleton):
     @classmethod
     def configure(cls):
+        return CurlClient
         if pycurl is not None and WxPayConf_pub.HTTP_CLIENT != "URLLIB":
             return CurlClient
         else:
@@ -345,8 +347,6 @@ class Wxpay_server_pub(Common_util_pub):
         tmpData = dict(self.data) #make a copy to save sign
         del tmpData['sign']
         sign = self.getSign(tmpData) #本地签名
-        print sign,111111111111
-        print self.data["sign"],22222222222
         if self.data['sign'] == sign:
             return True
         return False
@@ -407,7 +407,7 @@ class UnifiedOrder_refund(Wxpay_client_pub):
         """退款"""
         self.postXmlSSL()
         self.result = self.xmlToArray(self.response)
-        print(self.result,11111111111111)
+        print(self.result)
         return self.result
 
 
@@ -447,5 +447,5 @@ if __name__ == "__main__":
     transaction_id = "4200001738202301310966609598"
     out_trade_no = "202301311726421675157202183"
     out_refund_no = "202301311726421675157202183"
-    amount = "20"
+    amount = "30"
     refund_order(transaction_id,out_trade_no,out_refund_no,amount)