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
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, {})
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'})
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
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))
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)
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)
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'})
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)
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")
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)
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)