def _record_charge_event(cls, appId, userId, chip_count, diamond_count, trans_id, product_name, paytype): clientId = TyContext.UserSession.get_session_clientid(userId) total_fee = chip_count / 10000.0 + diamond_count / 10.0 # fake platform order, for gdss' sake ts = int(time.time()) seqNum = int(TyContext.RedisMix.execute('INCR', 'global.orderid.seq.a')) fake_order = paytype + TyContext.strutil.tostr62(ts, 6) + \ TyContext.strutil.tostr62(seqNum, 3) ct = datetime.now() paykey = ct.strftime('pay:%Y%m%d') name = u'%d钻石' % diamond_count if diamond_count else u'%d金币' % chip_count payinfo = { 'time': ct.strftime('%Y%m%d%H%M%S'), 'uid': userId, 'appId': appId, 'name': name, 'fee': total_fee, 'type': paytype, 'clientId': clientId, 'tyOrderId': fake_order, 'appOrderId': trans_id, 'prodId': product_name, } TyContext.RedisPayData.execute('LPUSH', paykey, json.dumps(payinfo)) # XXX 这里payCount加1不严格,但为了首充礼包,先加上。暂时无副作用 PayHelper.incr_paycount(userId) TyContext.RedisUser.execute(userId, 'HINCRBYFLOAT', 'user:'******'chargeTotal', total_fee)
def get_sign_and_pay_params(self, chargeInfo): sParaTemp = {} sParaTemp["service"] = "alipay.acquire.page.createandpay" appId = chargeInfo['appId'] packageName = chargeInfo.get('packageName') partnerParam = self.getPartnerParam(appId=appId, packageName=packageName) if not partnerParam: sParaTemp["partner"] = self.PARTNER else: sParaTemp["partner"] = partnerParam['partnerId'] external_user_id = '%s@%s' % (chargeInfo['userId'], chargeInfo['appId']) # sParaTemp["seller_id"] = self.SELLER_ID sParaTemp["_input_charset"] = 'utf-8' sParaTemp['out_trade_no'] = chargeInfo['platformOrderId'] sParaTemp['subject'] = chargeInfo['buttonName'] sParaTemp['product_code'] = 'GENERAL_WITHHOLDING' sParaTemp['integration_type'] = 'ALIAPP' sParaTemp[ 'agreement_sign_parameters'] = '{"productCode":"GENERAL_WITHHOLDING_P","signValidityPeriod":"12m","externalUserId":"%s", "notifyUrl":"%s"}' % ( external_user_id, PayHelper.getSdkDomain() + '/open/gateway/alifree/sign_callback') sParaTemp['total_fee'] = chargeInfo['chargeTotal'] ### 签约参数 ### sParaTemp["return_url"] = chargeInfo['return_url'] sParaTemp["request_from_url"] = chargeInfo['return_url'] sParaTemp["notify_url"] = PayHelper.getSdkDomain( ) + '/open/gateway/alifree/order_callback' sParaTemp['external_user_id'] = external_user_id sParaTemp['sign'] = self.calcSignMD5(**sParaTemp) sParaTemp['sign_type'] = 'MD5' return sParaTemp
def doCallback1(cls, rpath): datas = cls.__verify_callback__() if not datas: return '{"errorcode ":200024, "callback":1}' TyContext.ftlog.info('TuYouPayYee2.doCallback1 rpath', rpath, 'datas', datas) if 'sign' in datas: del datas['sign'] result = datas.get('status', 0) orderPlatformId = datas.get('orderid', '') if orderPlatformId.find('-') > 0: orderPlatformId = orderPlatformId.split('-')[0] total_fee = float(datas.get('amount', -1)) / 100 datas['third_orderid'] = datas['yborderid'] if result == 1: isOk = PayHelper.callback_ok(orderPlatformId, total_fee, datas) else: isOk = PayHelper.callback_error(orderPlatformId, str(result), datas) if isOk: return '{"errorcode ":0, "status":1, "callback":1}' else: return '{"errorcode ":200000, "status":1, "callback":1}'
def doYouKuCallback(cls, rpath): cb_rsp = {} rparam = TyContext.RunHttp.convertArgsToDict() try: orderPlatformId = rparam['apporderID'] price = rparam['price'] uid = rparam['uid'] sign = rparam['sign'] youku_appId = rparam['passthrough'] except: TyContext.ftlog.exception() TyContext.ftlog.info( 'doYouKuCallback->ERROR, param error !! rparam=', rparam) cb_rsp['status'] = 'failed' cb_rsp['desc'] = '参数错误' return json.dumps(cb_rsp) paykey_dict = TyContext.Configure.get_global_item_json( 'youku_paykeys', {}) paykey = str(paykey_dict[str(youku_appId)]) # 签名校验 if not cls.__verify_sign(rparam, paykey, sign): TyContext.ftlog.error( 'TuYouPayYouKu.doYouKuCallback sign verify error !!') cb_rsp['status'] = 'failed' cb_rsp['desc'] = '签名验证失败' return json.dumps(cb_rsp) try: result = int(rparam['result']) success_amount = rparam['success_amount'] if result < 1 or result > 2: TyContext.ftlog.error('doYouKuCallback got failed result:', result) cb_rsp['status'] = 'failed' cb_rsp['desc'] = 'result(%d) is not 1 or 2' % result PayHelper.callback_error(orderPlatformId, 'result(%d) is not 1 or 2' % result, rparam) return json.dumps(cb_rsp) if result == 2: TyContext.ftlog.error( 'doYouKuCallback got partial success result:' 'success_amount is', success_amount) except: pass total_fee = float(price) / 100 rparam['chargeType'] = 'youku' isOk = PayHelper.callback_ok(orderPlatformId, total_fee, rparam) if isOk: cb_rsp['status'] = 'success' cb_rsp['desc'] = '发货成功' return json.dumps(cb_rsp) else: cb_rsp['status'] = 'failed' cb_rsp['desc'] = '发货失败' return json.dumps(cb_rsp)
def doMsgDxCallback(self, rpath): MchNo = TyContext.RunHttp.getRequestParam('MchNo', '') Phone = TyContext.RunHttp.getRequestParam('Phone', '') Fee = TyContext.RunHttp.getRequestParam('Fee', '') OrderId = TyContext.RunHttp.getRequestParam('OrderId', '') MobileType = TyContext.RunHttp.getRequestParam('MobileType', '') Sign = TyContext.RunHttp.getRequestParam('Sign', '') if MchNo == '' or Phone == '' or Fee == '' or OrderId == '' or Sign == '': return '401~参数错误~' eft_skey = '' try: eft_appid = OrderId[0:2] eft_skey = TuYouPayMsgDx.appkeys.get(eft_appid) except: TyContext.ftlog.exception() tSign = MchNo + Phone + Fee + OrderId + eft_skey m = md5() m.update(tSign) vSign = m.hexdigest() if Sign != vSign: TyContext.ftlog.info('doMsgDxCallback->ERROR, sign error !! sign=', Sign, 'vSign=', vSign, 'eft_skey=', eft_skey) return '555~数字签名错误~' # 解密得到原始游戏订单号 orderPlatformId = '' try: orderPlatformId = OrderId[2:] Fee = int(Fee) except: TyContext.ftlog.exception() TyContext.ftlog.info('TuYouPayMsgDx.doMsgDxCallback orderPlatformId=', orderPlatformId) notifys = { 'MchNo': MchNo, 'vouchMobile': Phone, 'OrderId': OrderId, 'third_orderid': MchNo } if MobileType == 'LT': notifys['payType'] = 'EFTChinaUnion.msg' elif MobileType == 'DX': notifys['payType'] = 'EFTChinaTelecom.msg' from tysdk.entity.pay.pay import TuyouPay from tysdk.entity.paythird.helper import PayHelper PayHelper.set_order_mobile(orderPlatformId, Phone, 'v2') isOk = TuyouPay.doBuyChargeCallback(orderPlatformId, Fee, 'TRADE_FINISHED', notifys) if isOk: return '000~成功~' else: return '111~失败~'
def doCardCallback(cls, rpath): iHmacStr = TyContext.RunHttp.getRequestParam('hmac', '') cHmacStr = cls.getCallBackHmacString() if iHmacStr != cHmacStr: TyContext.ftlog.error( 'TuYouPayYee.doCardCallback, hmac verification error') return 'error' rparam = TyContext.RunHttp.convertArgsToDict() mer_code = TyContext.RunHttp.getRequestParam('p1_MerId') if mer_code != TuYouPayYee.p1_MerId: TyContext.ftlog.error( 'TuYouPayYee.doCardCallback error, mer_code is not me !!!') return 'error' platformOrderId = TyContext.RunHttp.getRequestParam('p2_Order') chargeKey = 'sdk.charge:' + platformOrderId chargeInfo = TyContext.RedisPayData.execute('HGET', chargeKey, 'charge') try: import json chargeInfo = json.loads(chargeInfo) rparam['chargeType'] = chargeInfo['chargeType'] except: TyContext.ftlog.exception() rparam['chargeType'] = 'yee.card' rparam['sub_paytype'] = TyContext.RunHttp.getRequestParam( 'p4_FrpId', 'na') r1_Code = TyContext.RunHttp.getRequestParam('r1_Code') if r1_Code != '1': # 长连接通知,客户端支付失败 status = TyContext.RunHttp.getRequestParamInt( 'p8_cardStatus', 10000) TyContext.ftlog.error( 'TuYouPayYee.doCardCallback error, charge return error !!! status=', status) errorInfo = u'支付失败,' + TuYouPayYee.code_map.get( status, 'status' + str(status)) PayHelper.callback_error(platformOrderId, errorInfo, rparam) return 'success' total_fee = float(rparam['p3_Amt']) isOK = PayHelper.callback_ok(platformOrderId, total_fee, rparam) if isOK: return 'success' else: return 'error'
def mock(cls, params): ''' args: paytype, pay version (v1/v3), platformOrderId, price, expect (expected result) ''' postparams = {} postparams['r0_Cmd'] = 'ChargeCardDirect' postparams['pc_BalanceAct'] = '' postparams['p5_CardNo'] = '14128110398186699' postparams['p2_Order'] = params['platformOrderId'] postparams['p9_MP'] = '' postparams['pb_BalanceAmt'] = '' postparams['p1_MerId'] = '10012097952' failcallback = params.get('failcallback', 0) if failcallback: postparams['r1_Code'] = '0' postparams['p8_cardStatus'] = '7' else: postparams['r1_Code'] = '1' postparams['p8_cardStatus'] = '0' postparams['p4_FrpId'] = 'SZX' postparams['r2_TrxId'] = '315261293636892I' postparams['p7_realAmount'] = str(float(params['price'])) postparams['p3_Amt'] = str(float(params['price'])) postparams['p6_confirmAmount'] = str(float(params['price'])) postparams['hmac'] = cls.getHmacString(postparams) cburl = PayHelper.getSdkDomain() + '/v1/pay/yee/callback' # use GET instead of POST for now response, _ = TyContext.WebPage.webget(cburl, postdata_=postparams) return 'yee.card ok'
def doPPSCallback(cls, rpath): cb_rsp = {} rparam = TyContext.RunHttp.convertArgsToDict() try: orderPlatformId = rparam['userData'].split(',')[0] appId = rparam['userData'].split(',')[1] price = rparam['money'] sign = rparam['sign'] except: TyContext.ftlog.info('doPPSCallback->ERROR, param error !! rparam=', rparam) cb_rsp['result'] = '-2' cb_rsp['message'] = 'Parameters error' return json.dumps(cb_rsp) paykey_dict = TyContext.Configure.get_global_item_json('pps_paykeys', {}) paykey = str(paykey_dict[str(appId)]) # 签名校验 if not cls.__verify_sign(rparam, paykey, sign): TyContext.ftlog.error('TuYouPayPPS.doPPSCallback sign verify error !!') cb_rsp['result'] = '-1' cb_rsp['message'] = 'Sign error' return json.dumps(cb_rsp) total_fee = float(price) isOk = PayHelper.callback_ok(orderPlatformId, total_fee, rparam) if isOk: cb_rsp['result'] = '0' cb_rsp['message'] = 'success' return json.dumps(cb_rsp) else: cb_rsp['result'] = '-6' cb_rsp['message'] = 'Other errors' return json.dumps(cb_rsp)
def doPayRequestMo9(cls, params): mo = TyContext.Cls_MsgPack() mo9appId = params['mo9appId'] mo9config = TyContext.Configure.get_global_item_json('mo9_config', {}) config = mo9config.get(str(mo9appId), None) notifyurl = PayHelper.getSdkDomain() + '/v1/pay/mo9/callback' if config: mo9account = str(config['account']) mo9key = str(config['paykey']) else: raise Exception( 'can not find mo9pay config info define of mo9appId=' + str(mo9appId)) paydata = { 'pay_to_email': mo9account, 'version': '2.1', 'return_url': cls.return_url, 'notify_url': notifyurl, 'invoice': params['orderPlatformId'], 'payer_id': str(params['userId']), 'lc': 'CN', 'amount': str(float(params['orderPrice'])), 'currency': 'CNY', 'item_name': params['orderName'], 'app_id': mo9appId, } paydata['sign'] = cls.__cal_sign(paydata, mo9key) urlparams = '&'.join(k + "=" + urllib.quote(paydata[k].encode('utf-8')) for k in sorted(paydata.keys())) openUrl = cls.pay_url + urlparams payData = {'openurl': openUrl} mo.setResult('code', 0) mo.setResult('payData', payData) return mo
def doWanDouJiaCallback(self, rpath): rparam = TyContext.RunHttp.convertArgsToDict() TyContext.ftlog.info('doWanDouJiaCallback->rparam=', rparam) transdata = rparam['content'] try: datas = json.loads(transdata) appId = datas['appKeyId'] appkeyconfig = TyContext.Configure.get_global_item_json('wannew_appkeys', {}) appKey = appkeyconfig[str(appId)] except: TyContext.ftlog.exception() TyContext.ftlog.info('doWanDouJiaCallback->ERROR, sign error !! transdata=', transdata) return 'Fail' # appKey = self.appkeys[str(appId)] sign = rparam['sign'] if self.verifySign(transdata, sign, appKey) != True: TyContext.ftlog.info('doWanDouJiaCallback->ERROR, sign error !! transdata=', transdata, 'sign=', sign) return 'Fail' orderPlatformId = datas['out_trade_no'] trade_status = 'TRADE_FINISHED' total_fee = int(float(datas['money'])) total_fee = total_fee / 100.0 isOk = PayHelper.callback_ok(orderPlatformId, total_fee, rparam) if isOk: return 'Success' else: return 'Fail'
def doZhangYueCallback(cls, rpath): rparam = TyContext.RunHttp.convertArgsToDict() try: appId = rparam['appId'] transData = json.loads(rparam['transData']) orderPlatformId = transData['merOrderId'] price = transData['payAmt'] sign = transData['md5SignValue'] except: TyContext.ftlog.info( 'TuYouPayZhangYueV4 -> ERROR, param error !! rparam=', rparam) return 'error' config = GameItemConfigure.get_game_channel_configure_by_orderId( orderPlatformId, 'zhangyue') paykey = config['zhangyue_md5_key'] # 签名校验 if not cls.__verify_sign(rparam, paykey, sign): TyContext.ftlog.error( 'TuYouPayZhangYue.doZhangYueCallback sign verify error !!') return 'error' total_fee = float(price) rparam['chargeType'] = 'zhangyue' rparam['third_orderid'] = transData['orderId'] isOk = PayHelper.callback_ok(orderPlatformId, total_fee, rparam) TyContext.ftlog.info("TuYouPayZhangYueV4 payhelper callback=", isOk) if isOk: return 'success' else: return 'error'
def _getPayRequsetParams(self, datas, bankIndex): httpdomain = PayHelper.getSdkDomain() rparam = {} # 游戏分配的订单号,这个必须是没用到过的,如果用过的trade_code,会返回-1004错误 rparam['mer_trade_code'] = datas['orderPlatformId'] # 商户发送的支付金额 rparam['rec_amount'] = int(datas['orderPrice']) # if TuYouPay360.DEBUG360 : # rparam['rec_amount'] = 0.01 rparam['product_name'] = 'TYB' + str(rparam['rec_amount'] * CHARGE_RATE_RMB) # 商户ID rparam['mer_code'] = TuYouPay360.merchant_code rparam['trans_service'] = TuYouPay360.trans_service rparam['input_cha'] = TuYouPay360.input_cha rparam['sign_type'] = TuYouPay360.sign_type rparam['notify_url'] = httpdomain + TuYouPay360.notify_url rparam['return_url'] = TuYouPay360.no_notify_url rparam['bank_code'] = TuYouPay360.bank_code[bankIndex] # "MOBILE_ZFB",子支付的区分 MOBILE_ZFB 支付宝 if bankIndex in (1, 2, 3): rparam['card_amount'] = datas['card_amount'] rparam['card_number'] = datas['card_number'] rparam['card_pwd'] = datas['card_pwd'] rparam['sign'] = self.buildMySign(rparam) TyContext.ftlog.info('TuYouPay360->params=', rparam) return rparam
def charge_data(cls, mi): chargeinfo = cls.get_charge_info(mi) appId = chargeinfo['appId'] if 'payInfo' in chargeinfo and chargeinfo['payInfo']: payInfo = chargeinfo['payInfo'] if 'appid' in payInfo and payInfo['appid']['lenovo']: appId = payInfo['appid']['lenovo'] diamondId = chargeinfo['buttonId'] prodconfig = TyContext.Configure.get_global_item_json( 'lenovo_prodids', {}) try: data = prodconfig[str(appId)].get(str(diamondId), {}) payCode = data['feecode'] except KeyError: config = GameItemConfigure( chargeinfo['appId']).get_game_channel_configure_by_package( 'lenovo', chargeinfo['packageName'], chargeinfo['mainChannel']) prodconfig = config.get('products', {}) diamondList = filter(lambda x: diamondId in x.values(), prodconfig) diamondConfig = diamondList[0] payCode = diamondConfig['code'] chargeinfo['chargeData'] = { 'msgOrderCode': payCode, 'waresid': payCode, 'cpprivateinfo': chargeinfo['platformOrderId'], 'notifyUrl': PayHelper.getSdkDomain() + '/open/ve/pay/lenovo/callback' } return cls.return_mo(0, chargeInfo=chargeinfo)
def doZhangYueCallback(cls, rpath): rparam = TyContext.RunHttp.convertArgsToDict() try: appId = rparam['appId'] transData = json.loads(rparam['transData']) orderPlatformId = transData['merOrderId'] price = transData['payAmt'] sign = transData['md5SignValue'] except: TyContext.ftlog.info( 'doZhangYueCallback->ERROR, param error !! rparam=', rparam) return 'error' paykey_dict = TyContext.Configure.get_global_item_json( 'zhangyue_paykeys', {}) paykey = str(paykey_dict[str(appId)]) # 签名校验 if not cls.__verify_sign(rparam, paykey, sign): TyContext.ftlog.error( 'TuYouPayZhangYue.doZhangYueCallback sign verify error !!') return 'error' total_fee = float(price) rparam['chargeType'] = 'zhangyue' rparam['third_orderid'] = transData['orderId'] isOk = PayHelper.callback_ok(orderPlatformId, total_fee, rparam) if isOk: return 'success' else: return 'error'
def mock(cls, params): ''' args: paytype, pay version (v1/v3), platformOrderId, expect (expected result) ''' failcallback = params.get('failcallback', 0) if failcallback: trade_status = 'TRADE_CLOSED' else: trade_status = 'TRADE_FINISHED' cburl = PayHelper.getSdkDomain() + '/v1/pay/alipay/callback' xmldata = cls.xmlrequest_template.format( platformOrderId=params['platformOrderId'], price=float(params['price']), status=trade_status, ) postparams = {} postparams['notify_data'] = xmldata postparams['sign'] = cls.__calc_sign('notify_data=' + xmldata) postparams['sign_type'] = "RSA" postparams['mock'] = "true" # use GET instead of POST for now response, _ = TyContext.WebPage.webget(cburl, postdata_=postparams, method_='POST') return 'tuyou ali ok'
def mock(cls, params): ''' args: paytype, pay version (v1/v3), platformOrderId, price, expect (expected result) ''' failcallback = params.get('failcallback', 0) postparams = {} postparams['method'] = 'check' postparams['cp_order_id'] = params['platformOrderId'] postparams['correlator'] = 'tuyoomock' postparams['order_time'] = '20130619144435' postparams['sign'] = cls.__calc_check_sign(postparams) cburl = PayHelper.getSdkDomain( ) + '/v1/pay/aiyouxi/callback/dizhu/tyhall' # use GET instead of POST for now response, _ = TyContext.WebPage.webget(cburl, postdata_=postparams) xmlroot = ElementTree.fromstring(response) if_pay = xmlroot.find('if_pay').text if int(if_pay) == 0: postparams['method'] = 'callback' postparams['pay_type'] = 'smsPay' if failcallback: postparams['result_code'] = '01' else: postparams['result_code'] = '00' postparams['fee'] = params['price'] postparams['sign'] = cls.__calc_callback_sign(postparams) response, _ = TyContext.WebPage.webget(cburl, postdata_=postparams) else: TyContext.ftlog.info( 'MockAigame.__check_callback->ERROR, response=', response) return 'aigame ok'
def doHuaWeiCallback(self, rpath): rparam = TyContext.RunHttp.convertArgsToDict() TyContext.ftlog.info('doHuaWeiCallback->rparam=', rparam) try: orderPlatformId = rparam['requestId'] clientId = rparam['extReserved'] huawei_config = TyContext.Configure.get_global_item_json('huawei_config', {}) hwapps = huawei_config.get(clientId, None) isOk = self.__check_ras_code__(hwapps, rparam, False) if isOk: total_fee = float(rparam['amount']) try: # huawei sdk also use payType, which is tuyou's sub_paytype rparam['sub_paytype'] = rparam['payType'] del rparam['payType'] except: pass isOk = PayHelper.callback_ok(orderPlatformId, total_fee, rparam) if isOk: return '{"result":0}' else: return '{"result":3}' else: return '{"result":1}' except: TyContext.ftlog.exception() return '{"result":94}'
def charge_data(cls, chargeinfo): appId = str(chargeinfo['appId']) clientId = str(chargeinfo['clientId']) if 'payInfo' in chargeinfo and chargeinfo['payInfo']: payInfo = chargeinfo['payInfo'] if 'appid' in payInfo and payInfo['appid']['huawei']: clientId = payInfo['appid']['huawei'] huawei_config = TyContext.Configure.get_global_item_json('huawei_config', {}) hwapps = huawei_config.get(clientId, None) if hwapps: userName = hwapps['userName'] # 必填 不参与签名 userID = hwapps['pay_id'] # String 支付ID。 在开发者联盟上获取的支付 ID 必填 applicationID = hwapps['hw_appid'] # String 应用ID。 在开发者联盟上获取的APP ID 必填 else: raise Exception('TuYouPayHuaWei can not find huawei config of clientId=' + clientId) amount = '%.2f' % float(chargeinfo[ 'chargeTotal']) # String 商品所要支付金额。格式为:元.角分,最小金额为分,保留到小数点后两位。例如:20.00,此金额将会在支付时显示给用户确认), 必填 productName = chargeinfo['diamondName'] # String(50) 商品名称。此名称将会在支付时显示给用户确认 必填 requestId = chargeinfo['platformOrderId'] # String(30) 开发者支付订单号。注:最长30字节。其值由开发者定义生成,用于标识一次支付请求,每次请求需唯一,不可重复。 productDesc = chargeinfo['diamondName'] # String(100) 商户对商品的自定义描述 。 必填,不能为空 rparam = {'userID': userID, 'applicationID': applicationID, 'amount': amount, 'productName': productName, 'requestId': requestId, 'productDesc': productDesc, } sign = cls.__check_ras_code__(hwapps, rparam, True) rparam['sign'] = sign rparam['userName'] = userName rparam['notifyUrl'] = PayHelper.getSdkDomain() + '/v1/pay/huawei/callback' chargeinfo['chargeData'] = rparam
def doBuyStraight(cls, userId, params, mo): appId = str(params['appId']) hwapps = TuyouPayHuaWei.HWAPPS[appId] userName = hwapps['userName'] # 必填 不参与签名 userID = hwapps['pay_id'] # String 支付ID。 在开发者联盟上获取的支付 ID 必填 applicationID = hwapps['hw_appid'] # String 应用ID。 在开发者联盟上获取的APP ID 必填 amount = '%d.00' % int( params['orderPrice']) # String 商品所要支付金额。格式为:元.角分,最小金额为分,保留到小数点后两位。例如:20.00,此金额将会在支付时显示给用户确认), 必填 productName = params['orderName'] # String(50) 商品名称。此名称将会在支付时显示给用户确认 必填 requestId = params['orderPlatformId'] # String(30) 开发者支付订单号。注:最长30字节。其值由开发者定义生成,用于标识一次支付请求,每次请求需唯一,不可重复。 productDesc = params['orderName'] # String(100) 商户对商品的自定义描述 。 必填,不能为空 rparam = {'userID': userID, 'applicationID': applicationID, 'amount': amount, 'productName': productName, 'requestId': requestId, 'productDesc': productDesc, } sign = cls.__check_ras_code__(hwapps, rparam, True) rparam['sign'] = sign rparam['userName'] = userName rparam['notifyUrl'] = PayHelper.getSdkDomain() + '/v1/pay/huawei/callback' mo.setResult('payData', rparam) pass
def mock(cls, params): ''' args: paytype, pay version (v1/v3), platformOrderId, smstext, expect (expected result) ''' paytype = params['paytype'] smstext = params['smstext'] payCode = smstext channelId = 1 appId = payCode[:12] appKey = cls.get_app_key(appId) params['payCode'] = payCode params['appId'] = payCode[:12] params['appKey'] = appKey params['channelId'] = channelId failcallback = params.get('failcallback', 0) if failcallback: params['orderId'] = cls.fail_orderid else: params['orderId'] = cls.orderid cburl = PayHelper.getSdkDomain() + '/v1/pay/ydmm/callback' xmldata = cls.xmlrequest_template.format( orderId=params['orderId'], appId=params['appId'], payCode=params['payCode'], totalPrice=params['price'], channelId=params['channelId'], platformOrderId=params['platformOrderId'], sign=cls.__calc_sign(params)) # use GET instead of POST for now response, _ = TyContext.WebPage.webget(cburl, postdata_=xmldata, method_='GET') return 'ydmm ok'
def _notify_game_server(cls, params): clientId = TyContext.UserSession.get_session_clientid(params['userId']) control = TyContext.ServerControl.findServerControl( params['appId'], clientId) if not control: TyContext.ftlog.error( '_notify_game_server can not find' ' server control, params', params) return notifyUrl = str(control['http'] + '/v2/game/charge/qipainotify?' + urlencode(params)) TyContext.ftlog.debug('_notify_game_server' ' arguments', params, 'notifyUrl', notifyUrl) # 通知游戏服务端进行vip等级的更新 rmbs = 0.0 diamonds = 0 if 'delta_chip' in params: rmbs += params['delta_chip'] / 10000.0 diamonds += int(params['delta_chip'] / 1000) if 'delta_diamond' in params: rmbs += params['delta_diamond'] / 10.0 diamonds += int(params['delta_diamond']) PayHelper.notify_game_server_on_diamond_change({ 'appId': params['appId'], 'clientId': clientId, 'buttonId': '360KP_PROD', 'userId': params['userId'], 'diamonds': diamonds, 'rmbs': rmbs }) from twisted.web import client d = client.getPage(notifyUrl, method='GET') def ok_callback(response): TyContext.ftlog.info('_notify_game_server response', response) def err_callback(error): TyContext.ftlog.error('_notify_game_server error', error) d.addCallbacks(ok_callback, err_callback)
def doDuoKuCallback(cls, rpath): TyContext.ftlog.info('doDuoKuCallback start') rparam = TyContext.RunHttp.convertArgsToDict() try: shortOrderPlatformId = rparam['cpdefinepart'] orderPlatformId = ShortOrderIdMap.get_long_order_id( shortOrderPlatformId) appId = rparam['appid'] sign = rparam['sign'] unit = rparam['unit'] amount = rparam['amount'] status = rparam['status'] mobileId = rparam.get('phone', '') except: TyContext.ftlog.info( 'doDuoKuCallback->ERROR, param error !! rparam=', rparam) TyContext.ftlog.exception() return 'failure' if status != 'success': PayHelper.callback_error(orderPlatformId, 'pay fail', rparam) return 'failure' paykey_dict = TyContext.Configure.get_global_item_json( 'duoku_paykeys', {}) paykey = str(paykey_dict[str(appId)]) # 签名校验 if not cls.__verify_sign(rparam, paykey, sign): return 'failure' if unit == 'fen': total_fee = float(amount) / 100 else: total_fee = float(amount) rparam['chargeType'] = 'duoku' rparam['third_orderid'] = rparam['orderid'] PayHelper.set_order_mobile(orderPlatformId, mobileId) isOk = PayHelper.callback_ok(orderPlatformId, total_fee, rparam) if isOk: return 'success' else: return 'failure'
def doWXpayCallback(cls, rpath): xmldata = TyContext.RunHttp.get_body_content() TyContext.ftlog.info('TuyouPayWXpay.doWXpayCallback in xmldata=', xmldata) xmlroot = ElementTree.fromstring(xmldata) wxappId = xmlroot.find('appid').text openId = xmlroot.find('openid').text rparam = {} for node in xmlroot.iter(): if 'xml' != node.tag: rparam[node.tag] = node.text TyContext.ftlog.debug('TuyouPayWXpay.doWXpayCallback in rparam=', rparam) responseXml = ElementTree.Element('xml') returnCode = ElementTree.SubElement(responseXml, 'return_code') returnMsg = ElementTree.SubElement(responseXml, 'return_msg') try: orderPlatformId = rparam['out_trade_no'] total_fee = float(rparam['total_fee']) / 100 wxconfig = TyContext.Configure.get_global_item_json( 'wx_config', {}) config = wxconfig.get(str(wxappId), None) wxpartnerKey = str(config['partnerKey']) sign = rparam['sign'] except: TyContext.ftlog.info( 'doWXpayCallback->ERROR, param error !! rparam=', rparam) returnCode.text = 'FAIL' returnMsg.text = '参数格式校验错误' responseStr = ElementTree.tostring(responseXml) return responseStr # 签名校验 if not cls.__verify_sign(rparam, wxpartnerKey, sign): TyContext.ftlog.error( 'TuyouPayWXpay.doWXpayCallback verify error !!') returnCode.text = 'FAIL' returnMsg.text = '签名失败' responseStr = ElementTree.tostring(responseXml) return responseStr rparam['third_orderid'] = openId rparam['chargeType'] = 'wxpay' isOk = PayHelper.callback_ok(orderPlatformId, total_fee, rparam) if isOk: returnCode.text = 'SUCCESS' returnMsg.text = 'OK' else: returnCode.text = 'FAIL' returnMsg.text = '发货失败' responseStr = ElementTree.tostring(responseXml) return responseStr
def _get_prepayid(cls, params, token, wxappId, wxpaySignKey, partnerId, partnerKey): prepayUrl = cls.prepay_url + '?access_token=' + token orderPlatformId = params['orderPlatformId'] notifyurl = PayHelper.getSdkDomain() + '/v1/pay/wxpay/callback' rparam = {} rparam['bank_type'] = 'WX' rparam['body'] = params['orderName'] rparam['partner'] = partnerId rparam['out_trade_no'] = orderPlatformId rparam['total_fee'] = str(int(params['orderPrice']) * 100) rparam['fee_type'] = '1' rparam['notify_url'] = notifyurl rparam['spbill_create_ip'] = TyContext.RunHttp.get_client_ip() rparam['input_charset'] = 'UTF-8' cal_str = '&'.join( k + "=" + rparam[k] for k in sorted(rparam.keys())) + '&key=' + partnerKey signValue = md5(cal_str.encode('utf-8')).hexdigest().upper() packageValue = '&'.join(k + "=" + urllib.quote(rparam[k].encode('utf-8')) for k in sorted(rparam.keys())) \ + "&sign=" + signValue postparams = {} postparams['appid'] = wxappId postparams['appkey'] = wxpaySignKey postparams['traceid'] = orderPlatformId postparams['noncestr'] = md5(str(random.randint(0, 10000))).hexdigest() postparams['package'] = packageValue postparams['timestamp'] = str(int(time.time())) sign_str = '&'.join(k + "=" + postparams[k] for k in sorted(postparams.keys())) app_signature = sha1(sign_str).hexdigest() postparams['app_signature'] = app_signature postparams['sign_method'] = 'sha1' del postparams['appkey'] postjson = json.dumps(postparams, ensure_ascii=False) response, _ = TyContext.WebPage.webget(prepayUrl, postdata_=postjson) response = json.loads(response) if 'prepayid' in response.keys() and response['prepayid']: payData = {} payData['appid'] = wxappId payData['appkey'] = wxpaySignKey payData['prepayid'] = response['prepayid'] payData['noncestr'] = postparams['noncestr'] payData['package'] = 'Sign=WXpay' payData['partnerid'] = partnerId payData['timestamp'] = postparams['timestamp'] sign_str = '&'.join(k + "=" + payData[k] for k in sorted(payData.keys())) sign = sha1(sign_str).hexdigest() payData['sign'] = sign return payData else: raise Exception('can not get wxpay prepayid of wxappId=' + wxappId)
def doBuyStraight(self, userId, params, mo): TyContext.RunHttp.getRequestParamJs(params, '360snscode', '') snscode = params['360snscode'] clientId = params['clientId'] appId = params['appId'] client_id, client_secret = self.get_360_app_info(appId, clientId) TyContext.ftlog.info('TuYouPay360SNS->doBuyStraight appId=', appId, 'clientId=', clientId, 'snscode=', snscode, 'app_client_id=', client_id, 'app_client_secret', client_secret) tokenurl = self.URL_ACCSEE_360PAY % (snscode, client_id, client_secret) response, tokenurl = TyContext.WebPage.webget(tokenurl) TyContext.ftlog.info('TuYouPay360SNS->doBuyStraight->snscode=', snscode, 'response=', response) error_info = None response_json = None try: response_json = json.loads(response) except: response_json = {} error_info = { 'error_code': -1, 'error_msg': "360返回值错误", 'content': str(response) } access_token = response_json.get('access_token', '') expires_in = response_json.get('expires_in', '') scope = response_json.get('scope', '') refresh_token = response_json.get('refresh_token', '') if access_token == '': if error_info == None: error_info = response_json if error_info == None: error_info = {'error_code': 0, 'error_msg': "OK"} from tysdk.entity.paythird.helper import PayHelper notify_uri = PayHelper.getSdkDomain() + '/v1/pay/360sns/callback' payData = { 'access_token': access_token, 'expires_in': expires_in, 'scope': scope, 'refresh_token': refresh_token, 'error_info': error_info, 'notify_uri': notify_uri } params['payData'] = payData mo.setResult('payData', payData) pass
def charge_data(self, chargeinfo): buttonId = chargeinfo['buttonId'] amount = str(int(float(chargeinfo['chargeTotal']) * 100)) prodName = chargeinfo['buttonName'] notifyurl = PayHelper.getSdkDomain() + '/v1/pay/youku/callback' chargeinfo['chargeData'] = { 'amount': amount, 'productId': buttonId, 'productName': prodName, 'notifyUrl': notifyurl }
def __calc_callback_sign(cls, rparam): paykey_dict = TyContext.Configure.get_global_item_json('youku_paykeys', {}) paykey = str(paykey_dict[rparam['passthrough']]) notifyurl = PayHelper.getSdkDomain() + '/v1/pay/youku/callback' sorted_args = [('apporderID', rparam['apporderID']), ('price', rparam['price']), ('uid', rparam['uid'])] encoded_args = urllib.urlencode(sorted_args) check_str = notifyurl + '?' + encoded_args check_sign = hmac.new(paykey) check_sign.update(check_str) digest = check_sign.hexdigest() return digest
def doUnionPayCallback(cls, rpath): params = TyContext.RunHttp.convertArgsToDict() TyContext.ftlog.debug('TuYouPayYdjd.TuYouPayUnionPay in prams=', '%s' % params) if not cls.validateSign(**params): return 'sign-error' orderId = params['orderId'] isOk = PayHelper.callback_ok(orderId, -1, params) if isOk: return 'ok' else: return 'error'
def doGeFuBigPaySdkCallback(cls, rpath): rparam = TyContext.RunHttp.convertArgsToDict() TyContext.ftlog.info('TuYouPayGeFuBigSdk Callback ', rparam) strtransdata = rparam['transdata'] sign = rparam['sign'].replace(' ', '+') params = eval(str(rparam['transdata'])) TyContext.ftlog.info('TuYouPayGeFuBigSdk callback transdata ', params) orderPlatformId = params['cporderid'] total_fee = float(params['money']) if rsacrypto._verify_with_publickey_pycrypto_md5( strtransdata, sign, _aibei_pubkey_py): if 0 == params['result']: rparam['third_orderid'] = params['transid'] rparam['chargeType'] = 'gefubig' PayHelper.callback_ok(orderPlatformId, total_fee, rparam) return 'SUCCESS' else: errinfo = '支付失败' PayHelper.callback_error(orderPlatformId, errinfo, rparam) return 'FAILURE' else: errinfo = '签名校验失败' PayHelper.callback_error(orderPlatformId, errinfo, rparam) return 'FAILURE'
def charge_data(self, mi): chargeinfo = self.get_charge_info(mi) appId = str(chargeinfo['appId']) huawei_appId = mi.getParamStr('huaWei_appId') huawei_config = TyContext.Configure.get_global_item_json( 'huawei_config', {}) try: hwapps = huawei_config.get(huawei_appId, None) userName = hwapps['userName'] # 必填 不参与签名 userID = hwapps['pay_id'] # String 支付ID。 在开发者联盟上获取的支付 ID 必填 applicationID = hwapps[ 'hw_appid'] # String 应用ID。 在开发者联盟上获取的APP ID 必填 except KeyError: config = GameItemConfigure( appId).get_game_channel_configure_by_package( 'huawei', chargeinfo['packageName'], chargeinfo['mainChannle']) userName = config.get('userName') # 必填 不参与签名 userID = config.get( 'huaWei_payId') # String 支付ID。 在开发者联盟上获取的支付 ID 必填 applicationID = config.get( 'huaWei_appId') # String 应用ID。 在开发者联盟上获取的APP ID 必填 hwapps = { 'pay_ras_pub_key': config.get('huaWei_publicKey'), 'pay_ras_privat_key': config.get('huaWei_privateKey') } amount = '%.2f' % float( chargeinfo['chargeTotal'] ) # String 商品所要支付金额。格式为:元.角分,最小金额为分,保留到小数点后两位。例如:20.00,此金额将会在支付时显示给用户确认), 必填 productName = chargeinfo[ 'diamondName'] # String(50) 商品名称。此名称将会在支付时显示给用户确认 必填 requestId = chargeinfo[ 'platformOrderId'] # String(30) 开发者支付订单号。注:最长30字节。其值由开发者定义生成,用于标识一次支付请求,每次请求需唯一,不可重复。 productDesc = chargeinfo[ 'diamondName'] # String(100) 商户对商品的自定义描述 。 必填,不能为空 rparam = { 'userID': userID, 'applicationID': applicationID, 'amount': amount, 'productName': productName, 'requestId': requestId, 'productDesc': productDesc, } sign = self.__check_ras_code__(hwapps, rparam, True) rparam['sign'] = sign rparam['userName'] = userName rparam['notifyUrl'] = PayHelper.getSdkDomain( ) + '/v1/pay/huawei/callback' chargeinfo['chargeData'] = rparam return self.return_mo(0, chargeInfo=chargeinfo)