@@ -19,10 +19,10 @@ WECHAT = settings.WECHAT  | 
            ||
| 19 | 19 | 
                @logit  | 
            
| 20 | 20 | 
                @transaction.atomic  | 
            
| 21 | 21 | 
                def get_userinfo_api(request):  | 
            
| 22 | 
                -    wechat = WECHAT.get('MINIAPP', {})
               | 
            |
| 22 | 
                +    wxcfg = WECHAT.get('MINIAPP', {})
               | 
            |
| 23 | 23 | 
                 | 
            
| 24 | 
                -    appid = wechat.get('appID')
               | 
            |
| 25 | 
                -    secret = wechat.get('appsecret')
               | 
            |
| 24 | 
                +    appid = wxcfg.get('appID')
               | 
            |
| 25 | 
                +    secret = wxcfg.get('appsecret')
               | 
            |
| 26 | 26 | 
                 | 
            
| 27 | 27 | 
                     code = request.POST.get('code', '')
               | 
            
| 28 | 28 | 
                     encryptedData = request.POST.get('encryptedData', '')
               | 
            
                @@ -212,7 +212,7 @@ WECHAT = {
               | 
            ||
| 212 | 212 | 
                'apiKey': '',  | 
            
| 213 | 213 | 
                'mch_cert': '',  | 
            
| 214 | 214 | 
                'mch_key': '',  | 
            
| 215 | 
                -        'redpacket': {
               | 
            |
| 215 | 
                +        'redpack': {
               | 
            |
| 216 | 216 | 
                 | 
            
| 217 | 217 | 
                }  | 
            
| 218 | 218 | 
                },  | 
            
                @@ -53,15 +53,15 @@ class OrderInfo(CreateUpdateMixin):  | 
            ||
| 53 | 53 | 
                 | 
            
| 54 | 54 | 
                order_id = ShortUUIDField(_(u'order_id'), max_length=255, help_text=u'订单唯一标识', db_index=True)  | 
            
| 55 | 55 | 
                 | 
            
| 56 | 
                -    prepay_id = models.CharField(_('prepay_id'), max_length=255, blank=True, null=True, help_text=u'预支付交易会话标识')
               | 
            |
| 57 | 
                -    transaction_id = models.CharField(_('transaction_id'), max_length=255, blank=True, null=True, help_text=u'微信订单号')
               | 
            |
| 56 | 
                + prepay_id = models.CharField(_(u'prepay_id'), max_length=255, blank=True, null=True, help_text=u'预支付交易会话标识')  | 
            |
| 57 | 
                + transaction_id = models.CharField(_(u'transaction_id'), max_length=255, blank=True, null=True, help_text=u'交易单号')  | 
            |
| 58 | 58 | 
                 | 
            
| 59 | 59 | 
                group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True)  | 
            
| 60 | 60 | 
                session_id = models.CharField(_(u'session_id'), max_length=255, blank=True, null=True, help_text=u'照片组唯一标识,同 PhotosInfo 表', db_index=True)  | 
            
| 61 | 61 | 
                photo_id = models.CharField(_(u'photo_id'), max_length=255, blank=True, null=True, help_text=u'飞图唯一标识', db_index=True)  | 
            
| 62 | 62 | 
                lensman_photo_id = models.CharField(_(u'lensman_photo_id'), max_length=255, blank=True, null=True, help_text=u'摄影师照片唯一标识,同 PhotosInfo 表', db_index=True)  | 
            
| 63 | 63 | 
                 | 
            
| 64 | 
                -    photo_type = models.IntegerField(_('photo_type'), choices=PHOTO_TYPE, default=NOMARK, help_text=u'购买照片类型', db_index=True)
               | 
            |
| 64 | 
                + photo_type = models.IntegerField(_(u'photo_type'), choices=PHOTO_TYPE, default=NOMARK, help_text=u'购买照片类型', db_index=True)  | 
            |
| 65 | 65 | 
                photo_status = models.IntegerField(_(u'photo_status'), choices=PHOTO_STATUS, default=WANTED, help_text=_(u'购买照片状态, 标识用户是否已经获得照片'), db_index=True)  | 
            
| 66 | 66 | 
                 | 
            
| 67 | 67 | 
                from_uid = models.CharField(_(u'from_uid'), max_length=255, help_text=u'付款用户唯一标识', db_index=True)  | 
            
                @@ -70,7 +70,7 @@ class OrderInfo(CreateUpdateMixin):  | 
            ||
| 70 | 70 | 
                body = models.CharField(_(u'body'), max_length=255, blank=True, null=True, help_text=u'商品描述')  | 
            
| 71 | 71 | 
                total_fee = models.IntegerField(_(u'total_fee'), default=0, help_text=u'总金额')  | 
            
| 72 | 72 | 
                 | 
            
| 73 | 
                -    trade_type = models.CharField(_('trade_type'), max_length=255, blank=True, null=True, help_text=u'支付方式')
               | 
            |
| 73 | 
                + trade_type = models.CharField(_(u'trade_type'), max_length=255, blank=True, null=True, help_text=u'支付方式')  | 
            |
| 74 | 74 | 
                 | 
            
| 75 | 75 | 
                pay_status = models.IntegerField(_(u'pay_status'), choices=PAY_STATUS, default=WAITING_PAY, help_text=u'支付状态', db_index=True)  | 
            
| 76 | 76 | 
                paid_at = models.DateTimeField(_(u'paid_at'), blank=True, null=True, help_text=_(u'支付时间'))  | 
            
                @@ -81,11 +81,11 @@ class OrderInfo(CreateUpdateMixin):  | 
            ||
| 81 | 81 | 
                # 微信统一下单  | 
            
| 82 | 82 | 
                unifiedorder_result = models.TextField(_(u'unifiedorder_result'), blank=True, null=True, help_text=_(u'统一下单结果'))  | 
            
| 83 | 83 | 
                # 微信支付回调  | 
            
| 84 | 
                -    notify_msg = models.TextField(_('notify_msg'), blank=True, null=True, help_text=u'回调信息')
               | 
            |
| 84 | 
                + notify_msg = models.TextField(_(u'notify_msg'), blank=True, null=True, help_text=u'回调信息')  | 
            |
| 85 | 85 | 
                 | 
            
| 86 | 86 | 
                class Meta:  | 
            
| 87 | 
                -        verbose_name = _('orderinfo')
               | 
            |
| 88 | 
                -        verbose_name_plural = _('orderinfo')
               | 
            |
| 87 | 
                + verbose_name = _(u'orderinfo')  | 
            |
| 88 | 
                + verbose_name_plural = _(u'orderinfo')  | 
            |
| 89 | 89 | 
                 | 
            
| 90 | 90 | 
                def __unicode__(self):  | 
            
| 91 | 91 | 
                         return u'{0.pk}'.format(self)
               | 
            
                @@ -10,7 +10,6 @@ from pywe_pay import WeChatPay  | 
            ||
| 10 | 10 | 
                from pywe_pay_notify import check_pay_notify  | 
            
| 11 | 11 | 
                from pywe_response import WXPAY_NOTIFY_FAIL, WXPAY_NOTIFY_SUCCESS  | 
            
| 12 | 12 | 
                from pywe_sign import check_signature  | 
            
| 13 | 
                -from pywe_xml import xml_to_dict  | 
            |
| 14 | 13 | 
                from TimeConvert import TimeConvert as tc  | 
            
| 15 | 14 | 
                 | 
            
| 16 | 15 | 
                from account.models import UserIncomeExpensesInfo, UserInfo  | 
            
                @@ -22,7 +21,7 @@ from utils.error.errno_utils import (GroupPhotoStatusCode, OrderStatusCode, User  | 
            ||
| 22 | 21 | 
                from utils.error.response_utils import response  | 
            
| 23 | 22 | 
                from utils.redis.rbrief import set_brief_info  | 
            
| 24 | 23 | 
                from utils.redis.rorder import set_lensman_order_record  | 
            
| 25 | 
                -from utils.wechat_utils import get_user_openid  | 
            |
| 24 | 
                +from utils.wx_utils import get_trade_type, get_user_openid  | 
            |
| 26 | 25 | 
                 | 
            
| 27 | 26 | 
                 | 
            
| 28 | 27 | 
                WECHAT = settings.WECHAT  | 
            
                @@ -52,14 +51,14 @@ def wx_order_create_api(request):  | 
            ||
| 52 | 51 | 
                return response(GroupPhotoStatusCode.GROUP_PHOTO_NOT_FOUND)  | 
            
| 53 | 52 | 
                 | 
            
| 54 | 53 | 
                # 判断是否重复购买  | 
            
| 55 | 
                - if OrderInfo.objects.filter(photo_id=photo_id, photo_type=photo_type_int, from_uid=user_id, pay_status=OrderInfo.PAID).exists():  | 
            |
| 54 | 
                + if OrderInfo.objects.filter(photo_id=photo_id, photo_type=photo_type_int, from_uid=user_id, pay_status=OrderInfo.PAID, status=True).exists():  | 
            |
| 56 | 55 | 
                return response(OrderStatusCode.WX_ORDER_PAID_ALREADY_EXISTS)  | 
            
| 57 | 56 | 
                 | 
            
| 58 | 57 | 
                     body = request.POST.get('body', '')  # 商品描述
               | 
            
| 59 | 58 | 
                     total_fee = int(request.POST.get('total_fee', 0))  # 总金额,单位分
               | 
            
| 60 | 59 | 
                 | 
            
| 61 | 60 | 
                # 金额校验  | 
            
| 62 | 
                - # if int(r.get(LENSMAN_PHOTO_PRICE % (user_id, photo_id, photo_type)) or 0) != total_fee:  | 
            |
| 61 | 
                + # if r.getint(LENSMAN_PHOTO_PRICE % (user_id, photo_id, photo_type)) != total_fee:  | 
            |
| 63 | 62 | 
                # return response(OrderStatusCode.FEE_CHECK_FAIL)  | 
            
| 64 | 63 | 
                 | 
            
| 65 | 64 | 
                # 获取 from_uid, to_uid  | 
            
                @@ -70,9 +69,9 @@ def wx_order_create_api(request):  | 
            ||
| 70 | 69 | 
                     trade_type = request.POST.get('trade_type', '')
               | 
            
| 71 | 70 | 
                 | 
            
| 72 | 71 | 
                # 根据 trade_type 获取 wechat 配置  | 
            
| 73 | 
                -    wechat = WECHAT.get(trade_type, {})
               | 
            |
| 72 | 
                +    wxcfg = WECHAT.get(trade_type, {})
               | 
            |
| 74 | 73 | 
                # WeChatPay 初始化  | 
            
| 75 | 
                -    wxpay = WeChatPay(wechat.get('appID'), wechat.get('apiKey'), wechat.get('mchID'))
               | 
            |
| 74 | 
                +    wxpay = WeChatPay(wxcfg.get('appID'), wxcfg.get('apiKey'), wxcfg.get('mchID'))
               | 
            |
| 76 | 75 | 
                 | 
            
| 77 | 76 | 
                # 生成订单  | 
            
| 78 | 77 | 
                order = OrderInfo.objects.create(  | 
            
                @@ -93,7 +92,7 @@ def wx_order_create_api(request):  | 
            ||
| 93 | 92 | 
                notify_url=settings.API_DOMAIN + '/wx/notify_url',  | 
            
| 94 | 93 | 
                out_trade_no=order.order_id,  | 
            
| 95 | 94 | 
                total_fee=total_fee,  | 
            
| 96 | 
                - trade_type=trade_type if trade_type != 'MINIAPP' else 'JSAPI',  | 
            |
| 95 | 
                + trade_type=get_trade_type(trade_type),  | 
            |
| 97 | 96 | 
                openid=get_user_openid(user, trade_type), # 可选,用户在商户appid下的唯一标识。trade_type=JSAPI,此参数必传  | 
            
| 98 | 97 | 
                )  | 
            
| 99 | 98 | 
                except WeChatPayException as e:  | 
            
                @@ -194,7 +193,7 @@ def wx_order_query_api(request):  | 
            ||
| 194 | 193 | 
                     transaction_id = request.POST.get('transaction_id', '')
               | 
            
| 195 | 194 | 
                 | 
            
| 196 | 195 | 
                try:  | 
            
| 197 | 
                - order = OrderInfo.objects.select_for_update().get(order_id=order_id)  | 
            |
| 196 | 
                + order = OrderInfo.objects.select_for_update().get(order_id=order_id, status=True)  | 
            |
| 198 | 197 | 
                except OrderInfo.DoesNotExist:  | 
            
| 199 | 198 | 
                return response(OrderStatusCode.WX_ORDER_NOT_FOUND)  | 
            
| 200 | 199 | 
                 | 
            
                @@ -204,14 +203,14 @@ def wx_order_query_api(request):  | 
            ||
| 204 | 203 | 
                return response(OrderStatusCode.WX_ORDER_PAY_FAIL)  | 
            
| 205 | 204 | 
                 | 
            
| 206 | 205 | 
                # 根据 trade_type 获取 wechat 配置  | 
            
| 207 | 
                -    wechat = WECHAT.get(order.trade_type, {})
               | 
            |
| 206 | 
                +    wxcfg = WECHAT.get(order.trade_type, {})
               | 
            |
| 208 | 207 | 
                # WeChatPay 初始化  | 
            
| 209 | 
                -    wxpay = WeChatPay(wechat.get('appID'), wechat.get('apiKey'), wechat.get('mchID'))
               | 
            |
| 208 | 
                +    wxpay = WeChatPay(wxcfg.get('appID'), wxcfg.get('apiKey'), wxcfg.get('mchID'))
               | 
            |
| 210 | 209 | 
                 | 
            
| 211 | 210 | 
                # 订单查询  | 
            
| 212 | 211 | 
                data = wxpay.order.query(transaction_id, order_id)  | 
            
| 213 | 212 | 
                # 签名校验  | 
            
| 214 | 
                -    if not check_signature(data, wechat.get('apiKey')):
               | 
            |
| 213 | 
                +    if not check_signature(data, wxcfg.get('apiKey')):
               | 
            |
| 215 | 214 | 
                return response(OrderStatusCode.SIGN_CHECK_FAIL)  | 
            
| 216 | 215 | 
                 | 
            
| 217 | 216 | 
                order.notify_msg = data  | 
            
                @@ -277,11 +276,10 @@ def wx_notify_url_api(request):  | 
            ||
| 277 | 276 | 
                if not success:  | 
            
| 278 | 277 | 
                return HttpResponse(WXPAY_NOTIFY_FAIL)  | 
            
| 279 | 278 | 
                 | 
            
| 280 | 
                -    out_trade_no = data.get('out_trade_no', '')
               | 
            |
| 281 | 279 | 
                try:  | 
            
| 282 | 
                - order = OrderInfo.objects.get(order_id=out_trade_no)  | 
            |
| 280 | 
                +        order = OrderInfo.objects.select_for_update().get(order_id=data.get('out_trade_no', ''), status=True)
               | 
            |
| 283 | 281 | 
                except OrderInfo.DoesNotExist:  | 
            
| 284 | 
                - return response(OrderStatusCode.WX_ORDER_NOT_FOUND)  | 
            |
| 282 | 
                + return HttpResponse(WXPAY_NOTIFY_FAIL)  | 
            |
| 285 | 283 | 
                 | 
            
| 286 | 284 | 
                order.notify_msg = request.body  | 
            
| 287 | 285 | 
                     order.transaction_id = data.get('transaction_id', '')
               | 
            
                @@ -320,21 +318,22 @@ def wx_balance_withdraw_api(request):  | 
            ||
| 320 | 318 | 
                return response(WithdrawStatusCode.BALANCE_NOT_ENOUGH)  | 
            
| 321 | 319 | 
                 | 
            
| 322 | 320 | 
                # 根据 trade_type 获取 wechat 配置  | 
            
| 323 | 
                -    wechat = WECHAT.get(trade_type, {})
               | 
            |
| 321 | 
                +    wxcfg = WECHAT.get(trade_type, {})
               | 
            |
| 324 | 322 | 
                # WeChatPay 初始化  | 
            
| 325 | 
                -    wxpay = WeChatPay(wechat.get('appID'), wechat.get('apiKey'), wechat.get('mchID'), mch_cert=wechat.get('mch_cert'), mch_key=wechat.get('mch_key'))
               | 
            |
| 323 | 
                +    wxpay = WeChatPay(wxcfg.get('appID'), wxcfg.get('apiKey'), wxcfg.get('mchID'), mch_cert=wxcfg.get('mch_cert'), mch_key=wxcfg.get('mch_key'))
               | 
            |
| 326 | 324 | 
                 | 
            
| 327 | 325 | 
                if withdraw_type == 'TRANSFER':  | 
            
| 328 | 326 | 
                ret_data = wxpay.transfer.transfer(user.openid, amount, u'摄影师余额提现,企业付款', check_name='NO_CHECK')  | 
            
| 329 | 327 | 
                elif withdraw_type == 'PACKET':  | 
            
| 328 | 
                +        wxrpk = wxcfg.get('redpack', {})
               | 
            |
| 330 | 329 | 
                ret_data = wxpay.redpack.send(  | 
            
| 331 | 330 | 
                user.openid,  | 
            
| 332 | 331 | 
                amount,  | 
            
| 333 | 
                -            send_name=wechat.get('redpacket', {}).get('SEND_NAME'),
               | 
            |
| 334 | 
                -            nick_name=wechat.get('redpacket', {}).get('NICK_NAME'),
               | 
            |
| 335 | 
                -            act_name=wechat.get('redpacket', {}).get('ACT_NAME'),
               | 
            |
| 336 | 
                -            wishing=wechat.get('redpacket', {}).get('WISHING'),
               | 
            |
| 337 | 
                -            remark=wechat.get('redpacket', {}).get('REMARK'),
               | 
            |
| 332 | 
                +            send_name=wxrpk.get('SEND_NAME'),
               | 
            |
| 333 | 
                +            nick_name=wxrpk.get('NICK_NAME'),
               | 
            |
| 334 | 
                +            act_name=wxrpk.get('ACT_NAME'),
               | 
            |
| 335 | 
                +            wishing=wxrpk.get('WISHING'),
               | 
            |
| 336 | 
                +            remark=wxrpk.get('REMARK'),
               | 
            |
| 338 | 337 | 
                )  | 
            
| 339 | 338 | 
                 | 
            
| 340 | 339 | 
                # 根据 ret_data 判断是否提现成功, 成功则减余额, 失败则提示  | 
            
                @@ -1,13 +0,0 @@  | 
            ||
| 1 | 
                -# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                -  | 
            |
| 3 | 
                -  | 
            |
| 4 | 
                -def get_user_openid(user, trade_type):  | 
            |
| 5 | 
                - if trade_type == 'MINIAPP':  | 
            |
| 6 | 
                - openid = user.openid_miniapp  | 
            |
| 7 | 
                - elif trade_type == 'JSAPI':  | 
            |
| 8 | 
                - openid = user.openid_oauth  | 
            |
| 9 | 
                - elif trade_type == 'APP':  | 
            |
| 10 | 
                - openid = None  | 
            |
| 11 | 
                - else:  | 
            |
| 12 | 
                - openid = None  | 
            |
| 13 | 
                - return openid  | 
            
                @@ -1,6 +1,10 @@  | 
            ||
| 1 | 1 | 
                # -*- coding: utf-8 -*-  | 
            
| 2 | 2 | 
                 | 
            
| 3 | 3 | 
                 | 
            
| 4 | 
                +def get_trade_type(trade_type):  | 
            |
| 5 | 
                + return trade_type if trade_type != 'MINIAPP' else 'JSAPI'  | 
            |
| 6 | 
                +  | 
            |
| 7 | 
                +  | 
            |
| 4 | 8 | 
                def get_user_openid(user, trade_type):  | 
            
| 5 | 9 | 
                if trade_type == 'MINIAPP':  | 
            
| 6 | 10 | 
                openid = user.openid_miniapp  |