class UmfService
Public Class Methods
添加私钥
# File lib/UmfService.rb, line 498 def UmfService.addMerPrivateCertMap(merId,privateKeyPath) $merId = $merId.merge({merId=>merId}) $privateKeyPath = $privateKeyPath.merge(merId=>privateKeyPath) end
构造方法
# File lib/UmfService.rb, line 23 def initialize merId,privateKeyPath if merId==nil || merId=='' return end if privateKeyPath==nil || privateKeyPath=='' return end $merId = $merId.merge({merId=>merId}) $privateKeyPath = $privateKeyPath.merge(merId=>privateKeyPath) end
Public Instance Methods
H5直连-范围URL地址
# File lib/UmfService.rb, line 131 def H5AutoConnectMap(params) pubParams = publicParams param = pubParams.merge params service = {"service"=>"active_scancode_order_new" , "auto_pay" => "TRUE"} param = param.merge service reqDataGet = UmfMerToPlat.new.makeRequestDataByGet(param) get_url = reqDataGet.getUrl UmfLogger.logInfoMsg("[UMF SDK] 公众号支付 请求 service = active_scancode_order_new 生成的getUrl = " + get_url) return get_url end
H5直连-返回请求参数
# File lib/UmfService.rb, line 144 def H5ConnectMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "active_scancode_order_new"} param = param.merge service return plainSortByAndPost(param) end
H5收银台 H5收银台—生成get后的请求参数,商户只需要拼接URL进行get请求即可
# File lib/UmfService.rb, line 51 def H5FrontPageMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "pay_req_h5_frontpage"} param = param.merge service reqDataGet = UmfMerToPlat.new.makeRequestDataByGet(param) get_url = reqDataGet.getUrl UmfLogger.logInfoMsg("[UMF SDK] H5收银台 请求 service = pay_req_h5_frontpage 生成的getUrl = " + get_url) return get_url end
公众号支付 公众号支付–生成get后的请求参数,商户只需要拼接URL进行get请求即可
# File lib/UmfService.rb, line 65 def PublicPaymentMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "publicnumber_and_verticalcode"} param = param.merge service reqDataGet = UmfMerToPlat.new.makeRequestDataByGet(param) get_url = reqDataGet.getUrl UmfLogger.logInfoMsg("[UMF SDK] 公众号支付 请求 service = publicnumber_and_verticalcode 生成的getUrl = " + get_url) return get_url end
Web收银台 Web收银台—生成get后的请求参数,商户只需要拼接URL进行get请求即可
# File lib/UmfService.rb, line 37 def WebFrontPagePayMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "req_front_page_pay"} param = param.merge service reqDataGet = UmfMerToPlat.new.makeRequestDataByGet(param) get_url = reqDataGet.getUrl UmfLogger.logInfoMsg("[UMF SDK] Web收银台 请求 service = req_front_page_pay 生成的getUrl = " + get_url) return get_url end
收款 : 扫码支付 主扫支付
# File lib/UmfService.rb, line 121 def activeNewScanPaymentMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "active_scancode_order_new"} param = param.merge service return plainSortByAndPost(param) end
收款 : 扫码支付 主扫支付
# File lib/UmfService.rb, line 112 def activeScanPaymentMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "active_scancode_order"} param = param.merge service return plainSortByAndPost(param) end
子商户入网–添加子商户方法
# File lib/UmfService.rb, line 533 def addChildMerInfoMap(params) UmfLogger.logInfoMsg("--------------------log start---------------------") UmfLogger.logInfoMsg("[UMF SDK 子商户入网]本次请求原始参数 " + params.to_s) param = { "merId"=>params["merId"], "merName"=>UmfRSACryptUtil.new.encrypt(params["merName"]), "merType"=>params["merType"], "contActsName"=>UmfRSACryptUtil.new.encrypt(params["contActsName"]), "mobileNo"=>params["mobileNo"], "licenseType"=>params["licenseType"], "licenseNo"=>params["licenseNo"], "organizationId"=>params["organizationId"], "taxPayerNum"=>params["taxPayerNum"], "lawyer"=>UmfRSACryptUtil.new.encrypt(params["lawyer"]), "cardNo"=>UmfRSACryptUtil.new.encrypt(params["cardNo"]), "bankName"=>UmfRSACryptUtil.new.encrypt(params["bankName"]), "bankAccount"=>UmfRSACryptUtil.new.encrypt(params["bankAccount"]), "province"=>params["province"], "areaCode"=>params["areaCode"], "merNotifyUrl"=>params["merNotifyUrl"], "pubPriFlag"=>params["pubPriFlag"], "bankBrhName"=>UmfRSACryptUtil.new.encrypt(params["bankBrhName"]), } UmfLogger.logInfoMsg("[UMF SDK 子商户入网]本次请求处理后参数 " + param.to_s) jsonStr = param.to_json signature = UmfRSACryptUtil.new.sign(jsonStr,params["merId"],'sha256') headers = { "Content-type" => "application/json;charset=utf-8", "Signature" => signature, "Authorization" => "Bearer"+ getTokenMap } respObj = UmfHttp.new.httpRequestWithJson(UMF_RESTPAY_ADDCHILDMERINFO,true,jsonStr,headers) return respObj end
撤销—撤销方法
# File lib/UmfService.rb, line 236 def cancelTradeMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "mer_cancel"} param = param.merge service return plainSortByAndPost(param) end
子商户入网–修改子商户信息方法
# File lib/UmfService.rb, line 604 def changeChildMerInfoMap(params) UmfLogger.logInfoMsg("--------------------log start---------------------") UmfLogger.logInfoMsg("[UMF SDK 子商户入网]本次请求原始参数 " + params.to_s) param = { "merId"=>params["merId"], "merName"=>UmfRSACryptUtil.new.encrypt(params["merName"]), "merType"=>params["merType"], "contActsName"=>UmfRSACryptUtil.new.encrypt(params["contActsName"]), "mobileNo"=>params["mobileNo"], "licenseType"=>params["licenseType"], "licenseNo"=>params["licenseNo"], "organizationId"=>params["organizationId"], "taxPayerNum"=>params["taxPayerNum"], "lawyer"=>UmfRSACryptUtil.new.encrypt(params["lawyer"]), "cardNo"=>UmfRSACryptUtil.new.encrypt(params["cardNo"]), "bankName"=>UmfRSACryptUtil.new.encrypt(params["bankName"]), "bankAccount"=>UmfRSACryptUtil.new.encrypt(params["bankAccount"]), "province"=>params["province"], "areaCode"=>params["areaCode"], "merNotifyUrl"=>params["merNotifyUrl"], "pubPriFlag"=>params["pubPriFlag"], "bankBrhName"=>UmfRSACryptUtil.new.encrypt(params["bankBrhName"]), } UmfLogger.logInfoMsg("[UMF SDK 子商户入网]本次请求处理后参数 " + param.to_s) jsonStr = param.to_s signature = UmfRSACryptUtil.new.sign(jsonStr,params["merId"],'sha256') headers = { "Content-type" => "application/json;charset=utf-8", "Signature" => signature, "Authorization" => "Bearer" + getTokenMap } respObj = UmfHttp.new.httpRequestWithJson(UMF_RESTPAY_CHANGECHILDREBUT,true,jsonStr,headers) return respObj end
鉴权—借记卡实名认证
# File lib/UmfService.rb, line 348 def creditCardAuthenticationMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "comm_auth"} param = param.merge service param["version"] = "1.0" return plainSortByAndPost(param) end
收款—信用卡直连
# File lib/UmfService.rb, line 102 def creditDirectMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "credit_direct_pay" , "pay_type" => "CREDITCARD"} param = param.merge service return plainSortByAndPost(param) end
鉴权—借记卡实名认证
# File lib/UmfService.rb, line 336 def debitCardAuthenticationMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "comm_auth"} param = param.merge service param["version"] = "1.0" return plainSortByAndPost(param) end
收款 : 借记卡直连
# File lib/UmfService.rb, line 92 def debitDirectMap(params) pubParams = publicParams param = pubParams.merge params service = {"service"=>"debit_direct_pay" , "pay_type"=>"DEBITCARD"} param = param.merge service return plainSortByAndPost(param) end
E秒付
# File lib/UmfService.rb, line 316 def epaymentOrderMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "epay_direct_req"} param = param.merge service return plainSortByAndPost(param) end
退款—普通退款方法
# File lib/UmfService.rb, line 246 def generalRefundMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "mer_refund"} param = param.merge service return plainSortByAndPost(param) end
传入请求参数,成sign字段
# File lib/UmfService.rb, line 481 def generateSign(params) plain = UmfStringUtil.new.getPlainSortByAndWithoutSignType(params) sign = UmfRSACryptUtil.new.sign(plain,params['mer_id'],'sha1') return sign end
子商户入网部分
子商户入网–获取token方法
# File lib/UmfService.rb, line 509 def getTokenMap # token在有效期内 if $spayRestPayAccessTokenTime+$spayRestPayExpiresIn >= Time.new.to_i return $spayRestPayAccessToken end params = { "grant_type"=>"client_credentials", "client_id"=>UmfConfig.umf_mer_client_id , "client_secret"=>UmfConfig.umf_mer_client_secret } UmfLogger.logInfoMsg("--------------------log start---------------------") UmfLogger.logInfoMsg("[UMF SDK 子商户入网]本次请求原始参数 " + params.to_s) jsonStr = params.to_json headers = {'Content-Type' => 'application/json'} respObj = UmfHttp.new.httpRequestWithJson(UMF_RESTPAY_AUTHORIZE,true,jsonStr,headers) $spayRestPayAccessToken = respObj['access_token'] $spayRestPayAccessTokenTime = Time.new.to_i # 1970年到指定日期的秒数 当前的秒数 $spayRestPayExpiresIn = respObj['expires_in'].to_i # 字符串转整数 return respObj['access_token'] end
鉴权—身份认证
# File lib/UmfService.rb, line 359 def identityAuthenticationMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "comm_auth"} param = param.merge service param["version"] = "1.0" return plainSortByAndPost(param) end
退款—批量转账退费请求
# File lib/UmfService.rb, line 256 def massTransferRefundMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "split_refund_req"} param = param.merge service return plainSortByAndPost(param) end
APP支付—生成签名
# File lib/UmfService.rb, line 452 def mobileGenerateSignMap(params) if params['merId']==nil || params['merId']=='' puts '[UMF SDK]签名参数商户号为空,请传入商户号' return end if params['orderId']==nil || params['orderId']=='' puts '[UMF SDK]签名参数订单号为空,请传入订单号' return end if params['orderDate']==nil ||params['orderDate']=='' puts '[UMF SDK]签名参数订单日期为空,请传入订单日期' return end if params['amount']==nil || params['amount']=='' puts '[UMF SDK]签名参数订单金额为空,请传入订单金额' return end # TODO 正则校验 merId = params['merId'] orderId = params['orderId'] orderDate = params['orderDate'] amount = params['amount'] plain = merId + orderId + amount + orderDate sign = UmfRSACryptUtil.new.mobileGenerateSign(plain,merId,'sha1') return sign end
APP支付下单
# File lib/UmfService.rb, line 442 def mobileOrderMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "pay_req"} param = param.merge service return plainSortByAndPost(param) end
子商户入网异步通知—联动通知商户数据,SDK解析结果
# File lib/UmfService.rb, line 658 def notifyChildParserMap(notifyChildParamsStr) if notifyChildParamsStr.length<0 return end notifyParamsArr = notifyChildParamsStr.split('&') map = {} notifyParamsArr.each { |elem| arr = elem.split('=',2) map[arr[0]] = arr[1] } sign = map['sign'] map.delete('sign') plain = UmfStringUtil.new.getPlainSortByAndWithoutSignType(map) verifyRet = UmfRSACryptUtil.new.verify(plain,sign,'sha1') if verifyRet == true puts '[UMF SDK 子商户入网] 平台通知数据验签成功' return map else puts '[UMF SDK 子商户入网] 平台通知数据验签失败' exit end end
异步通知
# File lib/UmfService.rb, line 391 def notifyDataParserMap(notifyParamsStr) if notifyParamsStr.length<0 return end # 联动发送异步通知URL地址后的参数 notifyParamsArr = notifyParamsStr.split('&') map = {} sign = '' notifyParamsArr.each { |elem| arr = elem.split('=',2) if arr[0]=='sign' sign = CGI.unescape(arr[1]) next elsif arr[0]=='sign_type' next else map[arr[0]] = CGI.unescape(arr[1]) end } plain = UmfStringUtil.new.getPlainSortByAndWithoutSignType(map) verifyRet = UmfRSACryptUtil.new.verify(plain,sign,'sha1') if verifyRet puts '[UMF SDK] 平台通知数据验签成功' map.delete('version') return map else puts '[UMF SDK] 平台通知数据验签失败' end end
收款 : 网银直连 网银直连SDK提供请求的最终URL生成,商户可以直接加载URL调起对应的支付方式
# File lib/UmfService.rb, line 79 def pBankDirectMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "pay_req_split_direct"} param = param.merge service reqDataGet = UmfMerToPlat.new.makeRequestDataByGet(param) get_url = reqDataGet.getUrl UmfLogger.logInfoMsg("[UMF SDK] 网银直连 请求 service = pay_req_split_direct 生成的getUrl = " + get_url) return get_url end
被扫支付
# File lib/UmfService.rb, line 154 def passiveScanPaymentMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "passive_scancode_pay"} param = param.merge service return plainSortByAndPost(param) end
付款—下单
# File lib/UmfService.rb, line 286 def paymentOrderMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "transfer_direct_req"} param = param.merge service return plainSortByAndPost(param) end
立码付API
# File lib/UmfService.rb, line 326 def publicVerticalMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "verticalcode_order"} param = param.merge service return plainSortByAndPost(param) end
付款—余额查询
# File lib/UmfService.rb, line 306 def queryAccountBalanceMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "query_account_balance"} param = param.merge service return plainSortByAndPost(param) end
子商户入网–查询审核状态方法
# File lib/UmfService.rb, line 641 def queryMerStateMap(params) UmfLogger.logInfoMsg("--------------------log start---------------------") UmfLogger.logInfoMsg("[UMF SDK 子商户入网]本次请求原始参数 " + params.to_s) merId = params["merId"] licenseNo = params["licenseNo"] url = UMF_RESTPAY_SELECTCHILDMERSTATE + "?merId=" + merId + "&licenseNo=" + licenseNo headers = { "Content-type" => "application/json;charset=utf-8", "Authorization" => "Bearer" + getTokenMap } respObj = UmfHttp.new.httpRequestWithJson(url,false,"",headers) return respObj end
付款—付款状态查询
# File lib/UmfService.rb, line 296 def queryPaymentStatusMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "transfer_query"} param = param.merge service return plainSortByAndPost(param) end
退款—退款状态查询方法
# File lib/UmfService.rb, line 266 def queryRefundStateMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "mer_refund_query"} param = param.merge service return plainSortByAndPost(param) end
订单查询—查询历史订单方法
# File lib/UmfService.rb, line 215 def queryhistoryOrderMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "mer_order_info_query"} param = param.merge service return plainSortByAndPost(param) end
订单查询—查询当天订单状态
# File lib/UmfService.rb, line 226 def querytodayOrderMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "query_order"} param = param.merge service return plainSortByAndPost(param) end
收款—快捷支付解约
# File lib/UmfService.rb, line 204 def quickCancelSurrenderMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "unbind_mercust_protocol_shortcut"} param = param.merge service return plainSortByAndPost(param) end
收款—快捷支付向平台获取短信验证码方法
# File lib/UmfService.rb, line 174 def quickGetMessageMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "sms_req_shortcut"} param = param.merge service return plainSortByAndPost(param) end
收款—快捷支付确认支付
# File lib/UmfService.rb, line 184 def quickPayConfirmMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "confirm_pay_shortcut"} param = param.merge service return plainSortByAndPost(param) end
收款—快捷支付下单方法
# File lib/UmfService.rb, line 164 def quickPayOrderMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "apply_pay_shortcut"} param = param.merge service return plainSortByAndPost(param) end
收款—快捷支付获取银行卡列表
# File lib/UmfService.rb, line 194 def quickQuerybankSupportMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "query_mer_bank_shortcut"} param = param.merge service return plainSortByAndPost(param) end
对账
# File lib/UmfService.rb, line 370 def reconciliationDownloadMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "download_settle_file"} param = param.merge service reqDataPost = UmfMerToPlat.new.makeRequestDataByPost(param) post_url = reqDataPost.getUrl mapfield = reqDataPost.getField output = UmfHttp.new.httpPost(post_url,mapfield) bool = writeSettle(params["mer_id"],params["settle_date"],params["settle_path"],output) if bool puts "[UMF SDK]对账文件写入本地成功" return true else puts "[UMF SDK]对账文件写入本地失败" return false end end
退款—退费信息补录方法
# File lib/UmfService.rb, line 276 def remedyRefundInformationMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "refund_info_replenish"} param = param.merge service return plainSortByAndPost(param) end
子商户入网异步通知—商户响应联动通知SDK生成字符串 该字符串拼装在HTML响应中的head中的meta标签CONTENT中
# File lib/UmfService.rb, line 684 def responseChildNotifyMap(params) merMap = {} merMap["merId"] = params["merId"] merMap["licenseNo"] = params["licenseNo"] merMap["ret_code"] = "0000" merPlain = UmfStringUtil.new.getPlainSortByAndWithoutSignType(merMap) merSign = UmfRSACryptUtil.new.sign(merPlain,params["merId"],"sha1") mer2UmfPlatStr = merPlain + "&sign=" + merSign return mer2UmfPlatStr end
异步通知-商户返回联动字符串拼接
# File lib/UmfService.rb, line 423 def responseUMFMap(params) merMap = {} merMap['mer_date'] = params['mer_date'] merMap['mer_id'] = params['mer_id'] merMap['order_id'] = params['order_id'] merMap['ret_code'] = '0000' merMap['ret_msg'] = 'success' merMap['version'] = '4.0' merPlain = UmfStringUtil.new.getPlainSortByAndWithoutSignType(merMap) merSign = UmfRSACryptUtil.new.sign(merPlain,params['mer_id'],'sha1') mer2UmfPlatStr = 'mer_date=' + merMap['mer_date'] + '&' + 'mer_id=' + merMap['mer_id'] + '&' + 'order_id=' + merMap['order_id'] + '&' + 'ret_code=0000&ret_msg=success&sign_type=RSA&version=4.0&sign=' + merSign return mer2UmfPlatStr end
分账—分账文件下载
# File lib/UmfService.rb, line 727 def splitFileDownloadMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "download_settle_file"} param = param.merge service reqDataPost = UmfMerToPlat.new.makeRequestDataByPost(param) post_url = reqDataPost.getUrl mapfield = reqDataPost.getField output = UmfHttp.new.httpPost(post_url,mapfield) bool = writeSettle(params["mer_id"],params["settle_date"],params["settle_path"],output) if bool puts "[UMF SDK]对账文件写入本地成功" return true else puts "[UMF SDK]对账文件写入本地失败" return false end end
分账—分账退费
# File lib/UmfService.rb, line 717 def splitRefundMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "mer_refund"} param = param.merge service return plainSortByAndPost(param) end
分账—分账请求针对标准分账的延时分账
# File lib/UmfService.rb, line 697 def splitReqMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "split_req"} param = param.merge service return plainSortByAndPost(param) end
分账—分账状态查询
# File lib/UmfService.rb, line 707 def splitStateMap(params) pubParams = publicParams param = pubParams.merge params service = {"service" => "query_split_order"} param = param.merge service return plainSortByAndPost(param) end
子商户入网–上传商户资质方法
# File lib/UmfService.rb, line 570 def uploadMerFileMap(params,files) UmfLogger.logInfoMsg('--------------------log start---------------------') UmfLogger.logInfoMsg('[UMF SDK 子商户入网]本次请求原始参数 ' + params.to_s) UmfLogger.logInfoMsg('[UMF SDK 子商户入网]本次请求上传文件 ' + files.to_s) jsonStr = params.to_json signature = UmfRSACryptUtil.new.sign(jsonStr,params['merId'],'sha256') url = UMF_RESTPAY_UPLOADCHILDFILE + '?data=' + CGI.escape(jsonStr) body = "" boundary = '---------------------' + Time.new.strftime('%Y%m%d') files.each{ |elem| if !(File.exist?(elem)) next end body = body + "\r\n--" + boundary data = File.binread(elem) v = elem.split('/').last body = body + "\r\n" + 'Content-Disposition: form-data; name="file"; filename="' + v + '"' + "\r\n"+ 'Content-Type: application/octet-stream' + "\r\n" + '' + "\r\n" + data } body = body + "\r\n--" + boundary + "--\r\n" headers = { 'Content-Type'=> 'multipart/form-data; boundary=' + boundary, 'Signature' => signature, 'Authorization' => 'Bearer' + getTokenMap } respObj = UmfHttp.new.httpRequestWithJson(url,true,body,headers) return respObj end
验签方法 @param string plain 联动返回明文字符串按序拼接(明文串去除sign_type字段和sign字段) @param string $sign 密文sign字段 @return bool
# File lib/UmfService.rb, line 492 def verifySign(plain,sign,algorithmType) return UmfRSACryptUtil.new.verify(plain,sign,algorithmType) end
对账文件下载后 写入数据到本地
# File lib/UmfService.rb, line 748 def writeSettle(mer_id,settle_date,settle_path,content) if mer_id=='' || settle_date=='' || settle_path=='' || content=='' mer_id==nil || settle_date==nil || settle_path==nil || content==nil return false end lastChar = settle_path[-1,1] if lastChar == "/" filepath = settle_path + mer_id + "_" + settle_date + ".txt" else filepath = settle_path + "/" + mer_id + "_" + settle_date + ".txt" end settle_content = content.encode('utf-8','gbk') bool = File.open(filepath, "w+") { |file| file.write(settle_content) } if bool UmfLogger.logInfoMsg("[UMF SDK]对账文件写入成功,路径 " + filepath) else UmfLogger.logInfoMsg("[UMF SDK]对账文件写入失败,路径 " + filepath) end UmfLogger.logInfoMsg("--------------------log end---------------------") return bool end
Private Instance Methods
post请求公共方法
# File lib/UmfService.rb, line 779 def plainSortByAndPost(params) reqDataPost = UmfMerToPlat.new.makeRequestDataByPost(params) post_url = reqDataPost.getUrl mapfield = reqDataPost.getField return UmfHttp.new.httpPost(post_url,mapfield) end
公共参数
# File lib/UmfService.rb, line 787 def publicParams { "charset"=>"UTF-8", "sign_type"=>"RSA", "res_format"=>"HTML", "version"=>"4.0", "amt_type"=>"RMB" } end