jiaweiqi 3 anos atrás
pai
commit
e607845ae3

+ 3 - 1
.gitignore

@@ -9,4 +9,6 @@ local_settings.*
 *.txt
 *.whl
 venv
-.idea
+.idea
+*.pem
+*.p12

+ 0 - 2
apps/WechatApplet/models.py

@@ -21,10 +21,8 @@ class WechatApplet(models.Model):
     agent_num = models.CharField(max_length=512, verbose_name=u'商户号', default="")
     agent_key = models.CharField(max_length=512, verbose_name=u'商户密钥', default="")
 
-    private_key = models.CharField(max_length=512, verbose_name=u'商户证书私钥', default="")
     cert_serial_no = models.CharField(max_length=512, verbose_name=u'商户证书序列号', default="")
     apiv3_key = models.CharField(max_length=512, verbose_name=u'商户APIv3密钥', default="")
-    cert_dir = models.CharField(max_length=100, verbose_name=u'平台证书存放目录', default="")
 
     class Meta:
         db_table = "wechat_applet"

+ 12 - 13
apps/activity/models.py

@@ -106,16 +106,15 @@ class SplitAccount(models.Model):
 
     def handSplitAccont(self, spd, pay, app):
         '''手动申请分账(在自动申请分账失败后  手动申请分账)'''
-        spc = SplitAccountFuc(app.authorizer_appid, app.agent_num, app.private_key, app.cert_serial_no, app.apiv3_key, cert_dir=app.cert_dir, proxy=None)
+        spc = SplitAccountFuc(app.authorizer_appid, app.agent_num, app.cert_serial_no, app.apiv3_key)
         # 状态是"待分账" 的查询分账  (状态是默认的怎么处理?没有申请过的  查询分账结果会报错--如果返回错误信息根据错误信息 如果没有发现该订单就重新申请  其他原因就不再申请)
         if spd.status == SplitAccountDetail.PENDING:
             self.splictAccountQuery(spc, pay.transaction_id, self.no, spd)
 
             if spd.status == SplitAccountDetail.SUCCESS:
-                raise CustomError(u'该分账已成功!')
-
+                return
             if spd.status == SplitAccountDetail.PENDING:
-                raise CustomError(u'该分账正在处理!')
+                return
         spr = SplitAccountReceiver.objects.filter(account=spd.account).first()
         if not spr:
             spr = SplitAccountReceiver.objects.create(account=spd.account)
@@ -137,12 +136,12 @@ class SplitAccount(models.Model):
                 if item['result'] == 'PENDING':
                     spd.status = SplitAccountDetail.PENDING
                 elif item['result'] == 'SUCCESS':
+                    spd.finish_time = datetime.datetime.strptime(item['finish_time'], "%Y-%m-%dT%H:%M:%S+08:00")
                     spd.status = SplitAccountDetail.SUCCESS
                 elif item['result'] == 'CLOSED':
                     spd.status = SplitAccountDetail.CLOSED
                     spd.fail_reason = item['fail_reason']
-                spd.create_time = item['create_time']
-                spd.finish_time = item['finish_time']
+                spd.create_time = datetime.datetime.strptime(item['create_time'], "%Y-%m-%dT%H:%M:%S+08:00")
                 spd.detail_no = item['detail_id']
                 spd.save()
 
@@ -165,11 +164,11 @@ class SplitAccount(models.Model):
             if detail and detail.account == item['account']:
                 if item['result'] == 'SUCCESS':
                     detail.status = SplitAccountDetail.SUCCESS
+                    detail.finish_time = datetime.datetime.strptime(item['finish_time'], "%Y-%m-%dT%H:%M:%S+08:00")
                 elif item['result'] == 'CLOSED':
                     detail.status = SplitAccountDetail.CLOSED
                     detail.fail_reason = item['fail_reason']
-                detail.create_time = item['create_time']
-                detail.finish_time = item['finish_time']
+                detail.create_time = datetime.datetime.strptime(item['create_time'], "%Y-%m-%dT%H:%M:%S+08:00")
                 detail.detail_no = item['detail_id']
                 detail.save()
 
@@ -179,7 +178,7 @@ class SplitAccount(models.Model):
             return
         if spd.status != SplitAccountDetail.DEFAULT:
             return
-        spc = SplitAccountFuc(app.authorizer_appid, app.agent_num, app.private_key, app.cert_serial_no, app.apiv3_key, cert_dir=app.cert_dir, proxy=None)
+        spc = SplitAccountFuc(app.authorizer_appid, app.agent_num, app.cert_serial_no, app.apiv3_key)
 
         if spr.status != SplitAccountReceiver.ADD:
             spc.splitaccount_addreceiver(spr.account)
@@ -202,21 +201,21 @@ class SplitAccount(models.Model):
                     spd.status = SplitAccountDetail.PENDING
                 elif item['result'] == 'SUCCESS':
                     spd.status = SplitAccountDetail.SUCCESS
+                    spd.finish_time = datetime.datetime.strptime(item['finish_time'], "%Y-%m-%dT%H:%M:%S+08:00")
                 elif item['result'] == 'CLOSED':
                     spd.status = SplitAccountDetail.CLOSED
                     spd.fail_reason = item['fail_reason']
-                spd.create_time = item['create_time']
-                spd.finish_time = item['finish_time']
+                spd.create_time = datetime.datetime.strptime(item['create_time'], "%Y-%m-%dT%H:%M:%S+08:00")
                 spd.detail_no = item['detail_id']
                 spd.save()
 
     @staticmethod
     def _addnew(branch, order_id, rebate, customer):
         if rebate <= 0:
-            return ''
+            return
         customer_wechat = CustomerWechat.objects.filter(customer=customer).first()
         if not customer_wechat:
-            return ''
+            return
 
         no = "FZ" + timezone.now().strftime('%y%m%d%H%M%S') + str(order_id)
         instance = SplitAccount.objects.create(

+ 3 - 0
carwin_activity/settings.py

@@ -219,6 +219,9 @@ MEDIA_ROOT = os.path.join(BASE_DIR, "uis/media/")
 TMP_URL = '/tmp/'
 TMP_ROOT = os.path.join(BASE_DIR, "tmp/")
 
+PRIVATE_CERT_ROOT = os.path.join(BASE_DIR, 'util/private_cert/')
+PUBLIC_CERT_ROOT = os.path.join(BASE_DIR, 'util/public_cert/')
+
 
 # 导入本地设置
 try:

+ 0 - 0
util/private_cert/__init__.py


+ 0 - 0
util/public_cert/__init__.py


+ 10 - 4
util/splitaccount_tool.py

@@ -28,18 +28,24 @@ class SplitAccountTool(object):
     GET = 'GET'
     POST = 'POST'
 
-    def __init__(self, appid, mchid, private_key, cert_serial_no, apiv3_key, cert_dir=None, proxy=None):
+    def __init__(self, appid, mchid, cert_serial_no, apiv3_key, proxy=None):
         self._mchid = mchid  # 商户号
         self._appid = appid
-        self._private_key = load_private_key(private_key)  # 商户证书私钥
+        self._private_key = self._innt_private_key()  # 商户证书私钥
         self._cert_serial_no = cert_serial_no  # 商户证书序列号
         self._apiv3_key = apiv3_key  # 商户APIv3密钥
-        self._cert_dir = cert_dir  # 平台证书存放目录
+        self._cert_dir = settings.PUBLIC_CERT_ROOT  # 平台证书存放目录
         self._gate_way = 'https://api.mch.weixin.qq.com'
         self._proxy = proxy
         self._certificates = []
         self._init_certificates()
 
+    def _innt_private_key(self):
+        os_path = settings.PRIVATE_CERT_ROOT + "apiclient_key.pem"
+        with open(os_path) as f:
+            private_key = f.read()
+        return load_private_key(private_key)
+
     def _init_certificates(self):
         if self._cert_dir and os.path.exists(self._cert_dir):
             for file_name in os.listdir(self._cert_dir):
@@ -78,7 +84,7 @@ class SplitAccountTool(object):
             cert_str = aes_decrypt(
                 nonce=nonce,
                 ciphertext=ciphertext,
-                associated_datformat_private_keya=associated_data,
+                associated_data=associated_data,
                 apiv3_key=self._apiv3_key)
             certificate = load_certificate(cert_str)
             if not certificate:

+ 2 - 2
util/wechatpay.py

@@ -28,10 +28,10 @@ WEIXIN_CALLBACK_API = 'https://lsr.zzly.vip/api/wechat_notify/'
 class SplitAccountFuc(object):
     '''直连服务商  分账  文档https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml'''
 
-    def __init__(self,appid, mchid, private_key, cert_serial_no, apiv3_key, cert_dir=None, proxy=None):
+    def __init__(self,appid, mchid, cert_serial_no, apiv3_key, proxy=None):
         self._appid = appid
         self._mchid = mchid
-        self._core = SplitAccountTool(appid, mchid, private_key, cert_serial_no, apiv3_key, cert_dir=cert_dir, proxy=proxy)
+        self._core = SplitAccountTool(appid, mchid, cert_serial_no, apiv3_key, proxy=proxy)
 
     def splitaccount_order(self, transaction_id, out_order_no, receivers):
         '''