예제 #1
0
    def make_payment_info(self, out_trade_no=None, subject=None, total_amount=None, body=None, passback_params=None):
        public = {  # public args
            "app_id": alipay_config.appid,
            "method": "alipay.trade.app.pay",
            "charset": "utf-8",
            "timestamp": datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),  # 2017-01-01 00:00:00
            "version": "1.0",
            "notify_url": "http://n01.me-yun.com:8000/1.0/alipaycallback",
            "sign_type": "RSA"
        }
        if BaseConfig.mode == 'online':
            public['notify_url'] = "http://api.videer.net/1.0/alipaycallback"

        order_info = {"product_code": "QUICK_MSECURITY_PAY",
                      # 业务参数
                      "out_trade_no": None,
                      "subject": None,
                      "total_amount": total_amount,
                      "body": body,
                      }
        if passback_params:
            order_info['passback_params'] = passback_params
        order_info["out_trade_no"] = "%s" % (out_trade_no)
        order_info["subject"] = "%s" % (subject)
        if total_amount <= 0.0:
            total_amount = 0.01
        order_info["total_amount"] = "%s" % (total_amount)

        public['biz_content'] = json.dumps(order_info, ensure_ascii=False)
        log.debug('public:%s', public)
        return public
예제 #2
0
    def update_core(self, oId, obj):
        log.debug('[%s/%s] update object start: %s' %
                  (self.appName, self.className, obj))
        # 用于保存递归对象,递归对象内容不存到父对象
        embed = None

        if obj.has_key('$set'):
            for key in obj['$set'].keys():
                # 如果是pointer类型,则递归处理对象
                if isinstance(
                        obj['$set'][key],
                        dict) and obj['$set'][key].has_key('_type') and obj[
                            '$set'][key]['_type'] == 'pointer':
                    # 创建对应的classhelper
                    c = ClassHelper(obj['$set'][key]['_class'], self.appName)
                    embed = {}
                    embed[key] = deepcopy(obj['$set'][key])
                    # 如果存在_id,则递归update
                    if obj['$set'][key].has_key('_id'):
                        o = c.update_core(obj['$set'][key]['_id'],
                                          obj['$set'][key]['_content'])
                    else:
                        o = c.create_core(obj['$set'][key]['_content'])
                    # 删除_content,使得父对象存储pointer对象
                    ''' TODO 此处无法保存updateAt和createAt返回客户端 '''
                    del obj['$set'][key]['_content']
                    obj['$set'][key]['_id'] = o[0]['_id']

                    print "Key:" + key
                    print "O: " + str(o)
                    print "embed1: " + str(embed)
                    embed[key]['_id'] = o[0]['_id']
                    # 将递归对象拼接起来
                    if o[1] != None:
                        if embed[key]['_content'].has_key('$set'):
                            del embed[key]['_content']['$set']
                        # 内部还有递归的情况,同级可能有多个递归对象c
                        for embed_key in o[1].keys():
                            embed[key]['_content'][embed_key] = o[1][embed_key]
                    else:
                        embed[key]['_content'] = o[0]
                    print "embed2: " + str(embed)
        else:
            obj['$set'] = {}
        obj['$set']['updateAt'] = datetime.now()
        try:
            result = (self.db.update(self.coll, {"_id": oId}, obj), embed)
            if result:
                CacheHelper.deleteCacheByOid(self.coll, oId)
            return result
        except Exception, e:
            return (ERR_OBJECTID_MIS.message, {})
예제 #3
0
def addFeedRecord(userId, feedType, actionId, extraInfo=None):
    """
    给用户添加feed记录
    :param userId: 发出动作的用户
    :param feedType: 行为,包括认领,关注.分享,购买
    :param actionId: 关联的事件id,目前只有认领,actionId为faceid
    :param extraInfo:
    :return:
    """
    faceHelper = ClassHelper('Face')
    face = faceHelper.get(actionId)
    if not face:
        return
    assign = face.get('assign')
    if assign and assign.get('status') == 1:
        assigner = assign.get('assigner')
    else:
        assigner = None
    fansHelper = ClassHelper('Followee')
    feedHelper = ClassHelper('InBox')
    fans = fansHelper.find({'followee': userId, 'effect': {'$gt': 0}})
    feedUserIds = []
    for fan in fans:
        feedInfo = {
            'user': fan['user'],
            'type': feedType,
            'actionId': actionId,
            'read': False
        }
        if extraInfo:
            feedInfo['extraInfo'] = extraInfo
        feedHelper.create(feedInfo)
        feedUserIds.append(fan['user'])
    rc = Redis.get_connection()
    for user in feedUserIds:
        count = Redis.incrby('user_unread_feed_count_%s' % user, 1)
        message_json = {
            'to_id': user,
            'count': count,
            't': 'feed',
            'uri': 'honey://newFeed/$' + userId
        }
        publish_result = rc.publish(
            'push_channel', json.dumps(message_json, ensure_ascii=False))
        log.debug('public_result: %s', publish_result)
        # 发推送
        if not assigner == user:
            message = {'userid': user, 'action': 'newFeed', 'otherid': userId}
            requests.post(BaseConfig.pushUrl,
                          data=json.dumps(message),
                          headers={'X-MeCloud-Debug': '1'})
예제 #4
0
def orderCallback(oId, userId, status, order):
    '''
    根据支付结果更新订单的状态
    :param oId:RechargeFlow Id
    :param userId:用户Id
    :param status: 支付是否成功,1为成功,3为等待验证
    :param order:第三方平台返回订单信息,包括错误码
    :return:
    '''
    log.debug('oId:%s, userId:%s, status:%d, order:%s', oId, userId, status,
              order)
    ###更新充值流水记录
    orderHelper = ClassHelper("RechargeFlow")
    rechargeFlow = orderHelper.get(oId)
    walletHelper = ClassHelper("Wallet")
    walletInfo = walletHelper.find_one({"user": userId})
    if status == 1:  # 充值成功,更新钱包
        rechargeFlow_action = {
            'destClass': 'RechargeFlow',
            'query': {
                "_id": oId
            },
            'action': {
                "@set": {
                    "status": status,
                    "order": order
                }
            }
        }
        if not walletInfo:  # 未找到钱包直接创建
            wallet = {"user": userId, 'balance': rechargeFlow['amount']}
            walletInfo = walletHelper.create(wallet,
                                             transaction=[rechargeFlow_action])
        else:
            wallet = {"$inc": {'balance': rechargeFlow['amount']}}
            walletInfo = walletHelper.update(walletInfo['_id'],
                                             wallet,
                                             transaction=[rechargeFlow_action])
            return walletInfo
    else:
        rechargeFlow = orderHelper.update(
            oId, {"$set": {
                "status": status,
                "order": order
            }})
        return rechargeFlow
예제 #5
0
    def create_core(self, obj):
        log.debug('[%s] create object start: %s' % (self.className, obj))
        embed = None
        for key in obj.keys():
            # 如果是pointer类型,则递归处理对象
            if isinstance(
                    obj[key], dict) and obj[key].has_key('_type') and obj[key][
                        '_type'] == 'pointer' and obj[key].has_key('_content'):
                # 创建对应的classhelper
                c = ClassHelper(obj[key]['_class'], self.appName)
                # 用于保存递归对象,递归对象内容不存到父对象
                embed = {}
                embed[key] = deepcopy(obj[key])
                # 如果存在_id,则递归update
                if obj[key].has_key('_id'):
                    o = c.update_core(obj[key]['_id'], obj[key]['_content'])
                else:
                    o = c.create_core(obj[key]['_content'])
                # 删除_content,使得父对象存储pointer对象
                ''' TODO 此处无法保存updateAt和createAt返回客户端 '''
                del obj[key]['_content']

                obj[key]['_id'] = o[0]['_id']
                print "Key:" + key
                print "O: " + str(o)
                print "embed1: " + str(embed)
                embed[key]['_id'] = o[0]['_id']
                # 将递归对象拼接起来
                if o[1] != None:
                    if embed[key]['_content'].has_key('$set'):
                        del embed[key]['_content']['$set']
                    # 内部还有递归的情况,同级可能有多个递归对象
                    for embed_key in o[1].keys():
                        embed[key]['_content'][embed_key] = o[1][embed_key]
                else:
                    embed[key]['_content'] = o[0]
                print "embed2: " + str(embed)
        obj['updateAt'] = datetime.now()
        obj['createAt'] = obj['updateAt']
        try:
            if obj.has_key("_id"):
                obj["_sid"] = MongoDb.toId(obj['_id'])
        except Exception, e:
            log.err("Error:%s", str(e))
예제 #6
0
 def post(self, action=None):
     log.debug('action:%s', action)
     try:
         if action == 'createWxAppOrder':
             self.createWxAppOrder()
         elif action == 'createAppleAppOrder':
             self.createAppleAppOrder()
         elif action == 'completeAppleAppOrder':
             self.completeAppleAppOrder()
         elif action == 'createAlipayAppOrder':
             self.createAlipayAppOrder()
         elif action == 'charge':  # 消费
             self.charge()
         else:
             print "action error: " + action
     except Exception, e:
         print e
         msg = traceback.format_exc()
         print msg
         self.write(ERR_PARA.message)
예제 #7
0
 def post(self):
     try:
         xml = self.request.body
         log.debug('xml: %s', xml)
         pub = Wxpay_server_pub()
         pub.saveData(xml)
         log.debug('pub.data: %s', pub.data)
         if pub.data['return_code'] == 'SUCCESS' and pub.data[
                 'result_code'] == 'SUCCESS':
             print 'wx call back result is success'
             order_no = pub.data.get('out_trade_no', None)
             log.debug('out_trade_no:%s', order_no)
             if order_no:
                 flow = ClassHelper("RechargeFlow").find_one({
                     'orderNo': order_no,
                     'status': 0
                 })
                 if flow:
                     payUtil.orderCallback(flow['_id'], flow['user'], 1,
                                           pub.data)
         else:
             order_no = pub.data.get('out_trade_no', None)
             if order_no:
                 flow = ClassHelper("RechargeFlow").find_one({
                     'orderNo': order_no,
                     'status': 0
                 })
                 if flow:
                     payUtil.orderCallback(flow['_id'], flow['user'], -1,
                                           pub.data)
     except Exception, e:
         log.err(e)
         msg = traceback.format_exc()
         log.err(msg)
예제 #8
0
    def pushMessage(self, good, owner_income_show, uploader_income_show):
        '''
        author:arther
        '''
        log.debug('good:%s', good)

        def callback(response):
            log.info('Push:%s', response.body)
            self.finish()

        pushUrl = BaseConfig.pushUrl
        face = ClassHelper('Face').get(good['goods'])
        if face:
            if face.get('assign', None) and face['assign'].get('user', None):
                if self.user['_id'] != face['assign']['user']:
                    ##ownedBought 购买了我主页的照片 排除掉照片主人购买自身主页照片的情况
                    ownedBoughtPushData = {
                        'userid': face['assign']['user'],
                        'action': 'ownedBought',
                        'otherid': self.user['_id'],
                        'extra': owner_income_show
                    }
                    client = tornado.httpclient.AsyncHTTPClient()
                    client.fetch(pushUrl, callback=callback, method="POST", body=json.dumps(ownedBoughtPushData),
                                 headers={'X-MeCloud-Debug': '1'})
            if face.get('assign', None) and face['assign'].get('assigner', None):
                ##assignedBought 购买了我共享的照片
                assignedBoughtPushData = {
                    'userid': face['assign']['assigner'],
                    'action': 'assignedBought',
                    'otherid': self.user['_id'],
                    'extra': uploader_income_show
                }
                client = tornado.httpclient.AsyncHTTPClient()
                client.fetch(pushUrl, callback=callback, method="POST", body=json.dumps(assignedBoughtPushData),
                             headers={'X-MeCloud-Debug': '1'})
예제 #9
0
    def get(self, className, objectId=None):
        log.debug('className : %s', className)
        start_on = time.time()
        admin = False
        if self.get_current_user() in BaseConfig.adminUser:
            admin = True
        '''TODO: 权限校验
        if not admin:
            if className in BaseConfig.accessNoClass:
                self.write(ERR_CLASS_PERMISSION.message)
                return
            if className not in BaseConfig.projectClass:
                # 不存在的class
                self.write(ERR_PATH_PERMISSION.message)
                return
        '''
        verify = self.verify_cookie(className)
        if not verify:
            self.write(ERR_UNAUTHORIZED.message)
            return
        if objectId:
            try:
                ObjectId(objectId)
            except Exception:
                self.write(ERR_OBJECTID_MIS.message)
                return
            obj = MeObject(className)
            if not obj.get(objectId):
                self.write(ERR_OBJECTID_MIS.message)
            else:
                mo = obj.get(objectId)
                self.filter_field(mo)
                self.write(json.dumps(mo, cls=MeEncoder))
        else:
            classHelper = ClassHelper(className)
            query = {}
            objs = None
            if self.request.arguments.has_key('aggregate'):
                query = eval(self.get_argument('aggregate'))
                objs = classHelper.aggregate(query)
            else:
                if self.request.arguments.has_key('where'):
                    query = eval(unquote(self.get_argument('where')))
                    try:
                        if query.has_key('_id'):
                            ObjectId(query['_id'])
                        if query.has_key('$or'):
                            for item in query['$or']:
                                if "_id" in item:
                                    item["_id"] = ObjectId(item["_id"])
                    except Exception:
                        self.write(ERR_OBJECTID_MIS.message)
                        return
                if self.request.arguments.has_key('keys'):
                    keys = eval(self.get_argument('keys'))
                else:
                    keys = None

                try:
                    sort = json.loads(self.get_argument('sort', '{}'))
                    idSort = sort.get('_id', -1)
                    sort = sort or None

                except Exception, e:
                    self.write(ERR_INVALID.message)
                    print e
                    return

                cache_next_page = False
                try:
                    if self.request.arguments.has_key('startId'):
                        startId = self.get_argument('startId')
                        if idSort == -1:
                            query["_id"] = {"$lt": ObjectId(startId)}
                        elif idSort == 1:
                            query["_id"] = {"$gt": ObjectId(startId)}
                    if self.request.arguments.has_key('limit'):
                        limit = int(self.get_argument('limit'))
                        cache_next_page = True
                    else:
                        limit = 20
                except Exception:
                    self.write(ERR_INVALID.message)
                    return

                skip = 0
                try:
                    if self.request.arguments.has_key('skip'):
                        skip = int(self.get_argument('skip'))
                except Exception:
                    self.write(ERR_INVALID.message)
                    return

                if limit > 100:
                    self.write(ERR_INVALID.message)
                    return

                objs = classHelper.find(query, keys, sort, limit, skip, cache_next_page=cache_next_page)

            objects = []
            for obj in objs:
                mo = MeObject(className, obj, False)
                mo.overLoadGet = False
                if self.get_current_user() and not admin:
                    acl = MeACL(mo['acl'])
                    if not acl.readAccess(self.user):
                        continue
                self.filter_field(mo)
                objects.append(mo)
            self.write(json.dumps(objects, cls=MeEncoder))
            end_on = time.time()
            log.debug('get request - className:%s , use time:%f', className, end_on - start_on)
예제 #10
0
    def post(self):
        # logger.debug('run alipay callback')
        args = self.request.arguments
        for k, v in args.items():
            args[k] = v[0]
        check_sign = params_to_query(args)
        params = query_to_dict(check_sign)
        sign = params['sign']
        log.debug('sign:%s', sign)
        toSignDict = {}
        for k, v in params.items():
            if k == 'sign' or k == 'sign_type':
                continue
            str = urllib.unquote_plus(v)
            toSignDict[k] = str
        # params = params_filter(params)
        message = params_to_query(toSignDict, quotes=False,
                                  reverse=False)  # 获取到要验证签名的串
        check_res = check_ali_sign(message, sign)  # 验签
        log.debug('check_res:%s', check_res)
        if check_res == False:
            log.warn('验签失败,非法订单')
            self.write("fail")
            return

        # 这里是去访问支付宝来验证订单是否正常
        res = verify_from_gateway({
            "partner": alipay_config.partner_id,
            "notify_id": params["notify_id"]
        })
        log.debug('res from alipay:%s', res)
        if res == False:
            log.warn('查询支付宝订单状态为false, 非法订单')
            self.write("fail")
            return

        trade_status = params["trade_status"]
        log.debug('trade_status:%s', trade_status)
        """
        下面是处理付款完成的逻辑
        """
        if trade_status == "TRADE_SUCCESS":  # 交易成功
            order_id = params["out_trade_no"]  # 你自己构建订单时候的订单ID
            alipay_order = params["trade_no"]  # 支付宝的订单号码
            total_fee = params["total_amount"]  # 支付总额
            log.debug('order_id:%s', order_id)
            # TODO:订单付款后的操作
            flow = ClassHelper("RechargeFlow").find_one({
                'orderNo': order_id,
                'status': 0
            })
            if flow:
                payUtil.orderCallback(flow['_id'], flow['user'], 1, toSignDict)
            self.write("success")
            return
        if trade_status == "TRADE_FINISHED":
            return

        if trade_status == "WAIT_BUYER_PAY":
            self.write("success")
            return
        if trade_status == "TRADE_CLOSED":  # 退款会回调这里
            self.write("success")
예제 #11
0
    def createAlipayAppOrder(self):
        print self.jsonBody
        obj = self.jsonBody
        coin_setting_id = obj.get('id')  # coinSettingId
        # channel = obj.get('channel', '')
        # version = obj.get('version', '')

        channel = self.request.headers.get("X-MeCloud-Channel", None)
        version = self.request.headers.get("X-MeCloud-Client", None)

        log.debug('coin_setting_id: %s', coin_setting_id)
        coin_setting = MeObject('CoinSetting').get(coin_setting_id)
        log.debug('coin_setting: %s', coin_setting)
        if coin_setting is None:
            # 未找到充值条目
            self.write(ERR_PARA.message)
            return
        out_trade_no = self.createOrderNo()
        log.debug('out_trade_no: %s', out_trade_no)
        if BaseConfig.mode == 'online':
            total_fee = coin_setting['price']
        else:
            total_fee = 0.01  # 这里将金额设为1分钱,方便测试
        body = '黑密虚拟商品-黑密滴' + str(coin_setting['amount']) + '个'
        subject = '黑密滴'
        payment_info = self.make_payment_info(out_trade_no=out_trade_no, subject=subject, total_amount=total_fee,
                                              body=body)
        log.debug('payment_info:%s', payment_info)
        res = alipay_core.make_payment_request(payment_info)
        result = {}
        result['code'] = 0
        result['errCode'] = 0
        result['res'] = res
        # result['res']='xxxx'
        log.debug('res:%s', res)
        log.debug('result res:%s', result['res'])
        # 创建充值流水记录
        rf = MeObject('RechargeFlow')
        rf['user'] = self.user['_id']
        rf['recharge'] = coin_setting['price']
        rf['amount'] = coin_setting['amount']
        rf['os'] = coin_setting['os']
        rf['platform'] = 0  # 支付宝APP
        if channel:
            rf['channel'] = channel
        rf['version'] = version
        rf['status'] = 0
        rf['orderNo'] = out_trade_no
        rf['order'] = ''
        rf.save()
        self.write(result)
예제 #12
0
    def createWxAppOrder(self):
        log.debug('in create wx app order json body:%s', self.jsonBody)
        obj = self.jsonBody
        coin_setting_id = obj.get('id')  # coinSettingId
        # channel = obj.get('channel', '')
        # version = obj.get('version', '')
        try:
            channel = self.request.headers.get("X-MeCloud-Channel", None)
            version = self.request.headers.get("X-MeCloud-Client", None)
        except:
            pass

        log.debug('coin_setting_id: %s', coin_setting_id)
        coin_setting = MeObject('CoinSetting').get(coin_setting_id)
        log.debug('coin_setting: %s', coin_setting)
        if coin_setting is None:
            # 未找到充值条目
            self.write(ERR_PARA.message)
            return
        out_trade_no = self.createOrderNo()
        log.debug('out_trade_no: %s', out_trade_no)
        pub = UnifiedOrder_pub()
        pub.parameters['out_trade_no'] = out_trade_no  # 设置参数自己的订单号
        pub.parameters['body'] = '黑蜜虚拟商品-黑蜜滴' + str(coin_setting['amount']) + '个'  # 设置商品描述
        # pub.parameters['total_fee'] = str(coin_setting['price'])  # 设置总金额
        if BaseConfig.mode == 'online':
            pub.parameters['total_fee'] = str(coin_setting['price'] * 100)
        else:
            pub.parameters['total_fee'] = '1'  # 设置总金额 1分用于测试
        pub.parameters['notify_url'] = WxPayConf_pub.NOTIFY_URL  # 设置回调url
        if BaseConfig.mode == 'online':
            pub.parameters['notify_url'] = WxPayConf_pub.NOTIFY_URL_RELEASE
        pub.parameters['trade_type'] = 'APP'  # 支付类型,固定为app
        wx_result = pub.getResult()
        log.info('wx create order result: %s', wx_result)

        if wx_result['return_code'] == 'SUCCESS':
            log.debug('prepay_id: %s', wx_result['prepay_id'])
            result = {}
            result['code'] = 0
            result['errCode'] = 0
            result['prepayid'] = wx_result['prepay_id']
            result['appid'] = wx_result['appid']
            result['partnerid'] = wx_result['mch_id']  # 商户号
            result['package'] = 'Sign=WXPay'
            result['noncestr'] = out_trade_no
            result['timestamp'] = str(int(time.time()))
            client_pub = UnifiedOrder_pub()
            client_pub.parameters['prepayid'] = result['prepayid']
            client_pub.parameters['appid'] = result['appid']
            client_pub.parameters['partnerid'] = result['partnerid']
            client_pub.parameters['package'] = result['package']
            client_pub.parameters['noncestr'] = result['noncestr']
            client_pub.parameters['timestamp'] = result['timestamp']
            client_sign = client_pub.getSign(client_pub.parameters)
            result['sign'] = client_sign
            # 创建充值流水记录
            rf = MeObject('RechargeFlow')
            rf['user'] = self.user['_id']
            rf['recharge'] = coin_setting['price']
            rf['amount'] = coin_setting['amount']
            rf['os'] = coin_setting['os']
            rf['platform'] = 1  # 微信APP
            if channel:
                rf['channel'] = channel
            rf['version'] = version
            rf['status'] = 0
            rf['orderNo'] = out_trade_no
            rf['order'] = ''
            rf.save()
            self.write(result)
        else:
            self.write(ERR_PARA.message)