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 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 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 _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, 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, 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, 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 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 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 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 _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 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 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)
def doPay(self, rpath): rparams = TyContext.RunHttp.convertArgsToDict() TyContext.ftlog.info('PayWeixinV4Gateway.doPay rparams=', rparams) if not self.checkGatewaySign(rparams): return '{"code":1,"msg":"signature error"}' appId = rparams['appId'] prodName = rparams['prodName'] prodPrice = rparams['prodPrice'] orderId = rparams['orderId'] notifyUrl = rparams['notifyUrl'] ### chargeInfo = { 'buttonName': prodName, 'platformOrderId': orderId, 'chargeTotal': float(prodPrice), } wxappId = 'wxb01a635a437adb75' # mi.getParamStr('wxappId') openid = None # mi.getParamStr('openid') tradeType = 'WAP' wxconfig = TyContext.Configure.get_global_item_json('wx_config', {}) config = wxconfig.get(str(wxappId), None) if config: wxappId = str(config['appId']) wxpaySignKey = str(config['paySignKey']) wxappSecret = str(config['appSecret']) wxpartnerId = str(config['partnerId']) wxpartnerKey = str(config['partnerKey']) else: raise PayErrorV4( 1, 'can not find wxpay config info define of wxappId=' + str(wxappId)) token = PayWeixinV4.get_accesstoken(wxappId, wxappSecret) callbackUrl = PayHelper.getSdkDomain() + '/open/gateway/wxpay/callback' payData = PayWeixinV4.get_prepayid_new(chargeInfo, token, wxappId, wxpaySignKey, wxpartnerId, wxpartnerKey, tradeType, openid, callbackUrl) ### chargeData = { 'appId': appId, 'prodName': prodName, 'prodPrice': prodPrice, 'orderId': orderId, 'notifyUrl': notifyUrl, 'payData': payData } TyContext.RedisPayData.execute('SET', 'sdk.charge.gateway:' + orderId, json.dumps(chargeData)) return json.dumps({'code': 0, 'payData': payData})
def mock(cls, params): ''' args: paytype, pay version (v1/v3), platformOrderId, price, expect (expected result) ''' postparams = {} postparams['uid'] = '792050' postparams['apporderID'] = params['platformOrderId'] postparams['passthrough'] = '691' postparams['price'] = params['price'] postparams['type'] = '1' postparams['sign'] = cls.__calc_callback_sign(postparams) cburl = PayHelper.getSdkDomain() + '/v1/pay/youku/callback' # use GET instead of POST for now response, _ = TyContext.WebPage.webget(cburl, postdata_=postparams) return 'youku ok'
def __verify_sign(cls, rparam, paykey, sign): 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() if digest != sign: TyContext.ftlog.error( 'TuYouPayYouKu verify sign failed: expected sign', sign, 'calculated', digest, 'rparam', rparam, 'check_str', check_str) return False return True
def mock(cls, params): ''' args: paytype, pay version (v1/v3), platformOrderId, price, expect (expected result) ''' postparams = {} postparams['mock'] = '1' failcallback = params.get('failcallback', 0) if failcallback: postparams['status'] = 0 else: postparams['status'] = 1 postparams['orderid'] = params['platformOrderId'] postparams['amount'] = str(float(params['price'])) postparams['yborderid'] = 'yee2orderid123' cburl = PayHelper.getSdkDomain() + '/v1/pay/yee2/callback10' # use GET instead of POST for now response, _ = TyContext.WebPage.webget(cburl, postdata_=postparams) return 'yee.card ok'
def mock(cls, params): ''' args: paytype, pay version (v1/v3), platformOrderId, price, expect (expected result) ''' postparams = {} postparams['iosOrderId'] = params['platformOrderId'] postparams['receipt'] = cls.receipt postparams['appId'] = params['appId'] postparams['authorCode'] = params['authorCode'] postparams['userId'] = params['userId'] postparams['clientId'] = params['clientId'] postparams['isMock'] = 'True' postparams['imei'] = 'null' cburl = PayHelper.getSdkDomain() + '/v1/pay/ios/callback' # use GET instead of POST for now response, _ = TyContext.WebPage.webget(cburl, postdata_=postparams) return 'ios ok'
def mock(cls, params): ''' args: paytype, pay version (v1/v3), platformOrderId, price, expect (expected result) ''' postparams = {} transData = {} postparams['appId'] = '3e02f7a3e7fd2ca62cc3' postparams['merId'] = '691' transData['orderId'] = '11133' transData['merOrderId'] = params['platformOrderId'] transData['payAmt'] = params['price'] postparams['transData'] = transData transData['md5SignValue'] = cls.__calc_callback_sign(postparams) postparams['transData'] = json.dumps(transData) cburl = PayHelper.getSdkDomain() + '/v1/pay/zhangyue/callback' # use GET instead of POST for now response, _ = TyContext.WebPage.webget(cburl, postdata_=postparams) return 'zhangyue ok'
def _getCardRequsetParams(self, datas, cardType): httpdomain = PayHelper.getSdkDomain() orderPrice = int(float(datas['orderPrice'])) card_amount = int(float(datas['card_amount'])) desKey = base64.decodestring(TuyouPayTuyou.szf_desKey) cardInfo = str(card_amount) + '@' + str( datas['card_number']) + '@' + str(datas['card_pwd']) # iv = Random.new().read(DES.block_size) desobj = DES.new(desKey, DES.MODE_ECB) padlen = 8 - len(cardInfo) % 8 for i in xrange(padlen): cardInfo = cardInfo + chr(padlen) cipher = desobj.encrypt(cardInfo) cardInfo = base64.b64encode(cipher) orderPlatformId = datas['orderPlatformId'] ct = datetime.datetime.now() orderId = ct.strftime( '%Y%m%d') + '-' + TuyouPayTuyou.szf_merId + '-' + orderPlatformId rparam = {} rparam['version'] = 3 # 版本号值为: 3 rparam['merId'] = TuyouPayTuyou.szf_merId # 商户在神州付的唯一身份标识 rparam['payMoney'] = orderPrice * 100 # 支付金额 单位:分 rparam['orderId'] = orderId # 订单号的格式:yyyyMMdd-merId-SN rparam['returnUrl'] = httpdomain + TuyouPayTuyou.szf_callback_url rparam[ 'cardInfo'] = cardInfo # DES 加密并做 BASE64 编码后的数据 DES 加密数据格式:充值卡面额[单位:元]@充值卡序列号 @充值卡密码 (请与神州付技术联系配置密钥,然后登录商户平台查看密钥) rparam['merUserName'] = '' # 支付此订单的用户的用户名 rparam['merUserMail'] = '' # 支付此订单的用户的邮箱 rparam['privateField'] = orderPlatformId # 可以传任意字母数字组成的字符串,回调的时候会传回给商户 rparam['verifyType'] = 1 # 固定传1 rparam['cardTypeCombine'] = cardType # 0:移动;1:联通;2:电信 md5String = str(rparam['version']) + str(rparam['merId']) + \ str(rparam['payMoney']) + str(rparam['orderId']) + \ str(rparam['returnUrl']) + str(rparam['cardInfo']) + \ str(rparam['privateField']) + str(rparam['verifyType']) + \ TuyouPayTuyou.szf_privateKey m = hashlib.md5() m.update(md5String) md5String = m.hexdigest() rparam['md5String'] = md5String # MD5 校验串 TyContext.ftlog.debug('_getCardRequsetParams->rparam=', rparam) return rparam
def annulCard(self, datas, rparam): TyContext.ftlog.info('TuYouPayShediaoYee->annulCard->rparam=', rparam, 'datas=', datas) # 非银行卡支付专业版支付请求,固定值 "ChargeCardDirect". p0_Cmd = "ChargeCardDirect" # 应答机制.为"1": 需要应答机制;为"0": 不需要应答机制. pr_NeedResponse = "1" # 调用签名函数生成签名串 hmacstr = self.getReqHmacString(rparam, p0_Cmd, pr_NeedResponse) TyContext.ftlog.debug('TuYouPayShediaoYee->annulCard->hmacstr=', hmacstr) # 进行加密串处理,一定按照下列顺序进行 httpdomain = PayHelper.getSdkDomain() params = { 'p0_Cmd': p0_Cmd, # 加入业务类型 'p1_MerId': TuYouPayShediaoYee.p1_MerId, # 加入商家ID 'p2_Order': rparam['p2_Order'], # 加入商户订单号 'p3_Amt': rparam['p3_Amt'], # 加入支付卡面额 'p4_verifyAmt': rparam['p4_verifyAmt'], # 加入是否较验订单金额 'p5_Pid': rparam['p5_Pid'], # 加入产品名称 'p6_Pcat': rparam['p6_Pcat'], # 加入产品类型 'p7_Pdesc': rparam['p7_Pdesc'], # 加入产品描述 'p8_Url': httpdomain + TuYouPayShediaoYee.callback_url, # 加入商户接收交易结果通知的地址 'pa_MP': rparam['pa_MP'], # 加入临时信息 'pa7_cardAmt': rparam['pa7_cardAmt'], # 加入卡面额组 'pa8_cardNo': rparam['pa8_cardNo'], # 加入卡号组 'pa9_cardPwd': rparam['pa9_cardPwd'], # 加入卡密组 'pd_FrpId': rparam['pd_FrpId'], # 加入支付通道编码 'pr_NeedResponse': pr_NeedResponse, # 加入应答机制 'hmac': hmacstr, # 加入校验码 'pz_userId': rparam['pz_userId'], # 用户唯一标识 'pz1_userRegTime': rparam['pz1_userRegTime'] # 用户的注册时间 } payUrl = TuYouPayShediaoYee.reqURL_SNDApro + TuYouPayShediaoYee.createQueryString( params) TyContext.ftlog.info('TuYouPayShediaoYee->annulCard->payUrl=', payUrl) response, payUrl = TyContext.WebPage.webget(payUrl) TyContext.ftlog.info('TuYouPayShediaoYee->annulCard->payUrl=', payUrl, 'response=', response) return TuYouPayShediaoYee.getPayResult(response, datas)
def getReqHmacString(self, rparam, p0_Cmd, pr_NeedResponse): # 进行加密串处理,一定按照下列顺序进行 sbOld = "" # 加入业务类型 sbOld += p0_Cmd # 加入商户代码 sbOld += TuYouPayShediaoYee.p1_MerId # 加入商户订单号 sbOld += rparam['p2_Order'] # 加入支付卡面额 sbOld += rparam['p3_Amt'] # 是否较验订单金额 sbOld += rparam['p4_verifyAmt'] # 产品名称 sbOld += rparam['p5_Pid'] # 产品类型 sbOld += rparam['p6_Pcat'] # 产品描述 sbOld += rparam['p7_Pdesc'] # 加入商户接收交易结果通知的地址 httpdomain = PayHelper.getSdkDomain() sbOld += httpdomain + TuYouPayShediaoYee.callback_url # 加入临时信息 sbOld += rparam['pa_MP'] # 加入卡面额组 sbOld += rparam['pa7_cardAmt'] # 加入卡号组 sbOld += rparam['pa8_cardNo'] # 加入卡密组 sbOld += rparam['pa9_cardPwd'] # 加入支付通道编码 sbOld += rparam['pd_FrpId'] # 加入应答机制 sbOld += pr_NeedResponse # 加入用户ID sbOld += str(rparam['pz_userId']) # 加入用户注册时间 sbOld += rparam['pz1_userRegTime'] return self.getHmacString(sbOld)
def mock(cls, params): ''' args: paytype, pay version (v1/v3), platformOrderId, payCode expect (expected result) ''' failcallback = params.get('failcallback', 0) if failcallback: trade_status = '00001' else: trade_status = '00000' params['status'] = trade_status cburl = PayHelper.getSdkDomain() + '/v1/pay/liantongw/callback' xmldata = cls.xmlrequest_template.format(payCode=params['payCode'], price=params['price'], platformOrderId='0000000000' + params['platformOrderId'], status=trade_status, sign=cls.__calc_sign(params)) # use GET instead of POST for now response, _ = TyContext.WebPage.webget(cburl, postdata_=xmldata, method_='GET') return 'liantongwo ok'
def doBuyStraight(self, userId, params, mo): from tysdk.entity.paythird.helper import PayHelper notifyurl = PayHelper.getSdkDomain() + '/v1/pay/360pay/callback' appId = params['appId'] prodId = params['prodId'] prodconfig = TyContext.Configure.get_global_item_json( '360pay_prodids', {}) data = prodconfig[str(appId)].get(prodId, None) if data: amount = data['price'] prodName = data['name'] else: raise Exception('can not find 360pay product define of prodId=' + prodId) payData = { 'amount': amount, 'productId': prodId, 'productName': prodName, 'notifyUrl': notifyurl, 'rate': '1000' } params['payData'] = payData mo.setResult('payData', payData)
def doBuyStraight(self, userId, params, mo): appId = params['appId'] prodId = params['prodId'] prodconfig = TyContext.Configure.get_global_item_json( 'youku_prodids', {}) data = prodconfig[str(appId)].get(prodId, None) if data is None: raise Exception('can not find youku product define of prodId=' + prodId) amount = data['price'] prodName = data['name'] payData = { 'amount': amount, 'productId': prodId, 'productName': prodName } params['payData'] = payData mo.setResult('payData', payData) from tysdk.entity.paythird.helper import PayHelper notifyurl = PayHelper.getSdkDomain() + '/v1/pay/youku/callback' TyContext.ftlog.debug('TuyouPayYouku doBuyStraight callback url=', notifyurl) mo.setResult('notifyUrl', notifyurl)
def charge_data(self, mi): chargeInfo = self.get_charge_info(mi) appId = chargeInfo['appId'] # check config packageName = chargeInfo['packageName'] changeName = chargeInfo['channelName'] config = GameItemConfigure(appId).get_sdk_configure( changeName, packageName, 'jinli') jinli_privateKey = config['jinli_privateKey'] ### rparams = { 'player_id': mi.getParamStr('player_id'), 'api_key': mi.getParamStr('api_key'), 'deal_price': str(chargeInfo['chargeTotal']), 'deliver_type': '1', 'notify_url': PayHelper.getSdkDomain() + '/open/ve/pay/jinlionline/callback', 'out_order_no': chargeInfo['platformOrderId'], 'subject': chargeInfo['buttonName'], 'submit_time': datetime.now().strftime('%Y%m%d%H%M%S'), 'total_fee': str(chargeInfo['chargeTotal']), } pairs = filter(lambda x: x[0] not in ['player_id'], rparams.items()) pairs.sort() data = ''.join(['%s' % x[1] for x in pairs]) # calc sign privateKey = load_privatekey(FILETYPE_PEM, self.loadRsaPrivateKey(jinli_privateKey)) sign = _sign_with_privatekey_openssl(data, privateKey) rparams['sign'] = sign # create order url = 'https://pay.gionee.com/order/create' response, purl = TyContext.WebPage.webget( url, postdata_=json.dumps(rparams), method_="POST") chargeInfo['chargeData'] = json.loads(response) return self.return_mo(0, chargeInfo=chargeInfo)
def doIosCallbackVerify(cls, paydata, isSandBox, isMock=False): platformOrderId = paydata['platformOrder'] userId = paydata['userId'] receiptJsonStr = paydata['receiptJsonStr'] if not receiptJsonStr or len(receiptJsonStr) < 200: return 'error-receipt' # documentation link: https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html if isMock: vrurl = PayHelper.getSdkDomain() + '/open/v3/mockios/verifyReceipt' elif isSandBox: vrurl = 'https://sandbox.itunes.apple.com/verifyReceipt' else: vrurl = 'https://buy.itunes.apple.com/verifyReceipt' TyContext.ftlog.debug('IOS->doIosCallbackVerify isSandBox=', isSandBox, 'url=', vrurl, 'datas=', paydata) paydata['iosurl'] = vrurl paydata['sandbox'] = isSandBox # verifying order can get errors like, "503 Service Unavailable", # TCPTimedOutError, etc. so retry 3 times. client will timeout after 8s, # so it is useless to retry longer. If sdk service restarts during the # process, client will get no response, in which case the client will # retry the callback. retries = 3 while retries > 0: try: response, vrurl = TyContext.WebPage.webget( vrurl, {}, None, receiptJsonStr, 'POST', {'Content-type': 'text/json'}) return cls.doIosCallbackVerifyDone(response, paydata) except Exception, e: TyContext.ftlog.error('IOS->doIosCallbackVerify webget failed.' ' exception', e, 'userId', userId, 'platformOrder', platformOrderId) retries -= 1
def handle_alipay_free_pay(self, rpath): """ 支付宝免密直接扣款,需要传入的参数有:appId, sign, orderId, prodName, prodPrice, userId :param rpath: :return: """ rparams = TyContext.RunHttp.convertArgsToDict() requiredParams = [ 'appId', 'userId', 'prodName', 'prodPrice', 'orderId', 'notifyUrl' ] for name in requiredParams: if not name in rparams: return '{"code":3, "msg":"缺少参数%s"}' % name if not self.checkGatewaySign(rparams): return '{"code":1, "msg":"signature error"}' appId = rparams['appId'] userId = rparams['userId'] hashUserId = '%s@%s' % (userId, appId) alipay_agreement_no = TyContext.RedisUser.execute( abs(hash(hashUserId)), 'HGET', 'universal_user:%s' % hashUserId, 'alipay_agreement_no') if not alipay_agreement_no: return '{"code":2, "msg":"还未签署免密协议"}' sParaTemp = {} sParaTemp["partner"] = self.PARTNER sParaTemp["seller_id"] = self.SELLER_ID sParaTemp["service"] = "alipay.acquire.createandpay" sParaTemp["_input_charset"] = 'utf-8' sParaTemp["product_code"] = "GENERAL_WITHHOLDING" sParaTemp['out_trade_no'] = rparams['orderId'] sParaTemp['subject'] = rparams['prodName'] sParaTemp['total_fee'] = rparams['prodPrice'] sParaTemp['it_b_pay'] = '30m' ### sParaTemp[ 'agreement_info'] = '{"agreement_no":"%s"}' % alipay_agreement_no sParaTemp["notify_url"] = PayHelper.getSdkDomain( ) + '/open/gateway/alifree/order_callback' sParaTemp['sign'] = self.calcSignMD5(**sParaTemp) sParaTemp['sign_type'] = 'MD5' # save order chargeData = { 'code': 0, 'appId': rparams['appId'], 'prodName': rparams['prodName'], 'prodPrice': rparams['prodPrice'], 'userId': rparams['userId'], 'orderId': rparams['orderId'], 'notifyUrl': rparams['notifyUrl'], } TyContext.RedisPayData.execute( 'SET', 'sdk.charge.gateway:' + chargeData['orderId'], json.dumps(chargeData)) # trade_no = xmlResponse.find('response').find('alipay').find('trade_no').text response, _ = TyContext.WebPage.webget(self.ALIPAY_GATEWAY_NEW, sParaTemp) xmlResponse = ElementTree.fromstring(response) if xmlResponse.find('is_success').text == 'T': status = 'success' else: status = 'failed' return json.dumps({ 'code': 0, 'status': status, 'prodName': rparams['prodName'], 'prodPrice': rparams['prodPrice'], 'orderId': rparams['orderId'], # 'trade_no': trade_no, })