def getDemoHtml(): req = {} req["version"] = SDKConfig().version req["encoding"] = SDKConfig().encoding req["signMethod"] = SDKConfig().signMethod req["frontUrl"] = SDKConfig().frontUrl req["backUrl"] = SDKConfig().backUrl req["txnType"] = "01" req["txnSubType"] = "01" req["bizType"] = "000201" req["channelType"] = "07" req["currencyCode"] = "156" req["txnAmt"] = "1000" req["merId"] = "777290058110048" req["orderId"] = datetime.now().strftime('%Y%m%d%H%M%S') req["txnTime"] = datetime.now().strftime('%Y%m%d%H%M%S') req["accessType"] = "0" # 签名示例 req = AcpService.sign(req) url = SDKConfig().frontTransUrl # 前台自提交表单示例 resp = AcpService.createAutoFormHtml(req, url) return resp
def process_refund(order_id, amount): unionpay = get_unionpay_info(order_id) if not unionpay: error_msg = "找不到已付款订单: {}".format(order_id) logging.error(error_msg) return False, error_msg if not check_refund_amount(unionpay, amount): error_msg = "退款金额大于支付金额!" logging.error(error_msg) return False, error_msg logging.debug("存储退款数据到数据库") refund_id = generate_refund_id(unionpay.order_id) refund = Refund( refund_id=refund_id, order_id=unionpay.order_id, unionpay_payment_id=unionpay.unionpay_id, refund_amount=amount, created_time=int(time()), ) refund.save() req_params, req_url = get_refund_form(unionpay, refund_id, amount) resp_data = AcpService.post(req_params, req_url) if not AcpService.validate(resp_data): error_msg = "退款回复报文验证失败" logging.error(error_msg) return False, error_msg logging.info(resp_data) respCode = resp_data['respCode'] if respCode == "00": logging.info("退款受理成功!") return True, resp_data if respCode == "03" or respCode == "04" or respCode == "05": error_msg = "退款受理超时" logging.warning(error_msg) return False, error_msg error_msg = "退款受理失败" logging.error(error_msg) refund.refund_status = 'e' refund.save() return False, error_msg
def get_query_form(order_id): payment = get_payment_info(order_id) if not payment: return None, None txnTime = payment.payment_time or datetime.fromtimestamp(payment.created_time).strftime('%Y%m%d%H%M%S') req = {} req["version"] = SDKConfig().version req["encoding"] = SDKConfig().encoding req["signMethod"] = SDKConfig().signMethod req["txnType"] = "00" req["txnSubType"] = "00" req["bizType"] = "000000" req["accessType"] = "0" req["channelType"] = "07" req["merId"] = get_payment_merchant_id() req["orderId"] = order_id req["txnTime"] = txnTime # 签名示例 req_params = AcpService.sign(req) req_url = SDKConfig().singleQueryUrl return req_params, req_url
def get_payment_form(order_id): time_now = datetime.now().strftime('%Y%m%d%H%M%S') time_out = datetime.now() + timedelta(minutes=15) time_out = time_out.strftime('%Y%m%d%H%M%S') req = {} req["version"] = SDKConfig().version req["encoding"] = SDKConfig().encoding req["txnType"] = "01" req["txnSubType"] = "01" req["bizType"] = "000202" req["frontUrl"] = SDKConfig().frontUrl req["backUrl"] = SDKConfig().backUrl req["signMethod"] = SDKConfig().signMethod req["channelType"] = "07" req["accessType"] = "0" req["currencyCode"] = "156" req["merId"] = get_payment_merchant_id() req["orderId"] = order_id req["txnAmt"] = str(get_payment_amount(order_id)) req["txnTime"] = time_now req['payTimeout'] = time_out # 签名示例 req_params = AcpService.sign(req) req_url = SDKConfig().frontTransUrl return req_params, req_url
def get_refund_form(unionpay, refund_id, refund_amount): time_now = datetime.now().strftime('%Y%m%d%H%M%S') req = {} req["version"] = SDKConfig().version req["encoding"] = SDKConfig().encoding req["signMethod"] = SDKConfig().signMethod req["txnType"] = "04" req["txnSubType"] = "00" req["bizType"] = "000201" req["accessType"] = "0" req["channelType"] = "07" req["backUrl"] = SDKConfig().backUrl req["merId"] = get_payment_merchant_id() req["orderId"] = refund_id req['origQryId'] = unionpay.unionpay_id req["txnTime"] = time_now req["txnAmt"] = str(refund_amount) # 签名示例 req_params = AcpService.sign(req) req_url = SDKConfig().backTransUrl return req_params, req_url
def demoTrade(): req = {} req["version"] = SDKConfig().version req["encoding"] = SDKConfig().encoding req["signMethod"] = SDKConfig().signMethod req["txnType"] = "95" req["txnSubType"] = "00" req["bizType"] = "000000" req["channelType"] = "07" req["accessType"] = "0" req["certType"] = "01" req["merId"] = "777290058110097" req["orderId"] = datetime.now().strftime('%Y%m%d%H%M%S') req["txnTime"] = datetime.now().strftime('%Y%m%d%H%M%S') # 签名示例 req = AcpService.sign(req) url = SDKConfig().backTransUrl # post示例 resp = AcpService.post(req, url) result = "请求报文:" + map2str(req) + "<br>\n" result = result + "应答报文:" + map2str(resp) + "<br>\n" # 验签示例 result = result + "验签成功<br>\n" if AcpService.validate( resp) else "验签失败<br>\n" if "respCode" in resp: # 取应答报文里的参数的示例 result = result + "respCode=" + resp["respCode"] + "<br>\n" result = result + "respMsg=" + resp["respMsg"] + "<br>\n" if resp["respCode"] == "00": resultCode = AcpService.updateEncryptCert(resp) if resultCode == 1: result += "加密公钥更新成功" + "<br>\n" elif resultCode == 0: result += "加密公钥无更新" + "<br>\n" else: result += "加密公钥更新失败" + "<br>\n" return result
def trade(): req = {} req["version"] = SDKConfig().version req["encoding"] = SDKConfig().encoding req["signMethod"] = "11" req["txnType"] = "78" req["txnSubType"] = "00" req["bizType"] = "000301" req["channelType"] = "07" req["merId"] = "777290058110048" req["orderId"] = datetime.now().strftime('%Y%m%d%H%M%S') req["txnTime"] = datetime.now().strftime('%Y%m%d%H%M%S') req["accessType"] = "0" req["accNo"] = "6226090000000048" # 签名示例 req = AcpService.signBySecureKey(req, "88888888") url = SDKConfig().backTransUrl # post示例 resp = AcpService.post(req, url) result = "请求报文:" + map2str(req) + "<br>\n" result = result + "应答报文:" + map2str(resp) + "<br>\n" # 验签示例 result = result + "验签成功<br>\n" if AcpService.validateBySecureKey( resp, "88888888") else "验签失败<br>\n" if "respCode" in resp: # 取应答报文里的参数的示例 result = result + "respCode=" + resp["respCode"] + "<br>\n" result = result + "respMsg=" + resp["respMsg"] + "<br>\n" # 解密示例 if "customerInfo" in resp: customerInfo = AcpService.parseCustomerInfo(resp["customerInfo"]) if "phoneNo" in customerInfo: result = result + "phoneNo=" + customerInfo[ "phoneNo"] + "<br>\n" return result
def trade(): req = {} req["version"] = SDKConfig().version req["encoding"] = SDKConfig().encoding req["signMethod"] = SDKConfig().signMethod req["txnType"] = "21" req["txnSubType"] = "03" req["bizType"] = "000401" req["accessType"] = "0" req["channelType"] = "07" req["merId"] = "777290058110097" req["txnTime"] = datetime.now().strftime('%Y%m%d%H%M%S') req["batchNo"] = "0001" req["totalQty"] = "10" req["totalAmt"] = "1000" req["fileContent"] = AcpService.enCodeFileContent("./files/bat.txt") # 签名示例 req = AcpService.sign(req) url = SDKConfig().batchTransUrl # post示例 resp = AcpService.post(req, url) result = "请求报文:" + map2str(req) + "<br>\n" result = result + "应答报文:" + map2str(resp) + "<br>\n" # 验签示例 result += ("验签成功<br>\n" if AcpService.validate(resp) else "验签失败<br>\n") if "respCode" in resp: # 取应答报文里的参数的示例 result = result + "respCode=" + resp["respCode"] + "<br>\n" result = result + "respMsg=" + resp["respMsg"] + "<br>\n" if resp["respCode"] == "00": result += "成功<br>\n" else: result += "失败<br>\n" return result
def trade(): time_now = datetime.now().strftime('%Y%m%d%H%M%S') req = {} req["version"] = SDKConfig().version req["encoding"] = SDKConfig().encoding req["signMethod"] = SDKConfig().signMethod req["txnType"] = "04" req["txnSubType"] = "00" req["bizType"] = "000201" req["accessType"] = "0" req["channelType"] = "07" req["backUrl"] = SDKConfig().backUrl req["orderId"] = time_now req["merId"] = "777290058110048" req["origQryId"] = "871803200930040336758" req["txnTime"] = time_now req["txnAmt"] = "100" # 签名示例 req = AcpService.sign(req) url = SDKConfig().backTransUrl # 后台自提交表单示例 resp = AcpService.post(req, url) if not AcpService.validate(resp): logging.error("回复报文验证失败") return jsonify({'status': 'error', 'error': 'not validate'}) respCode = resp['respCode'] if respCode == "00": logging.info("退款受理成功!") return jsonify({'status': 'ok', 'data': resp}) if respCode == "03" or respCode == "04" or respCode == "05": logging.warning("退款受理超时") return jsonify({'status': 'error', 'error': '退款受理超时'}) else: logging.error("退款受理失败") return jsonify({'status': 'error', 'error': '退款受理失败', 'detail': resp})
def trade(): req = {} req["version"] = SDKConfig().version req["encoding"] = SDKConfig().encoding req["signMethod"] = SDKConfig().signMethod req["txnType"] = "76" req["txnSubType"] = "01" req["bizType"] = "000000" req["accessType"] = "0" req["fileType"] = "00" req["merId"] = "700000000000001" req["txnTime"] = datetime.now().strftime('%Y%m%d%H%M%S') req["settleDate"] = "0119" # 签名示例 req = AcpService.sign(req) url = SDKConfig().fileTransUrl # post示例 resp = AcpService.post(req, url) result = "请求报文:" + map2str(req) + "<br>\n" result = result + "应答报文:" + map2str(resp) + "<br>\n" # 验签示例 result = result + ("验签成功<br>\n" if AcpService.validate(resp) else "验签失败<br>\n") if "respCode" in resp: # 取应答报文里的参数的示例 result = result + "respCode=" + resp["respCode"] + "<br>\n" result = result + "respMsg=" + resp["respMsg"] + "<br>\n" if resp["respCode"] == "00": dir = "./files/" # 先建立好文件夹哦 result += "文件保存到:" + dir + ("成功<br>\n" if AcpService.deCodeFileContent( resp, dir) else "失败<br>\n") result += analyzeFile(dir, resp["fileName"]) return result
def getDemoHtml(): accNo = "6226090000000048" customerInfo = {} customerInfo['phoneNo'] = '18100000000' customerInfo['certifTp'] = '01' customerInfo['certifId'] = '510265790128303' customerInfo['customerNm'] = '张三' customerInfo['cvn2'] = '248' customerInfo['expired'] = '1912' req = {} req["version"] = SDKConfig().version req["encoding"] = SDKConfig().encoding req["signMethod"] = SDKConfig().signMethod req["frontUrl"] = SDKConfig().frontUrl req["backUrl"] = SDKConfig().backUrl req["txnType"] = "79" req["txnSubType"] = "00" req["bizType"] = "000301" req["channelType"] = "07" req["merId"] = "777290058110097" req["orderId"] = datetime.now().strftime('%Y%m%d%H%M%S') req["txnTime"] = datetime.now().strftime('%Y%m%d%H%M%S') req["accessType"] = "0" # accNo、customerInfo组装示例 req["accNo"] = AcpService.encryptData(accNo) req["customerInfo"] = AcpService.getCustomerInfoWithEncrypt(customerInfo) req["encryptCertId"] = AcpService.getEncryptCertId() # 签名示例 req = AcpService.sign(req) url = SDKConfig().frontTransUrl # 前台自提交表单示例 resp = AcpService.createAutoFormHtml(req, url) return resp
def trade(): req = {} req["version"] = SDKConfig().version req["encoding"] = SDKConfig().encoding req["signMethod"] = SDKConfig().signMethod req["txnType"] = "22" req["txnSubType"] = "03" req["bizType"] = "000401" req["accessType"] = "0" req["channelType"] = "07" req["merId"] = "777290058110097" req["txnTime"] = datetime.now().strftime('%Y%m%d%H%M%S') req["batchNo"] = "0001" # 签名示例 req = AcpService.sign(req) url = SDKConfig().batchTransUrl # post示例 resp = AcpService.post(req, url) result = "请求报文:" + map2str(req) + "<br>\n" result += "应答报文:" + map2str(resp) + "<br>\n" # 验签示例 result += ("验签成功<br>\n" if AcpService.validate(resp) else "验签失败<br>\n") if "respCode" in resp: # 取应答报文里的参数的示例 result += "respCode=" + resp["respCode"] + "<br>\n" result += "respMsg=" + resp["respMsg"] + "<br>\n" if resp["respCode"] == "00": path = "./files/" # 先建立好文件夹哦 result += "文件保存到:" \ + path + ("成功<br>\n" if AcpService.deCodeFileContent(resp, path) else "失败<br>\n") return result
def notify(params): logging.info("notify req:[" + reqStr(params) + "]") result = "收到通知:" + reqStr(params) + "<br>\n" if (AcpService.validate(params)): # 服务器签名验证成功 # 请在这里加上商户的业务逻辑程序代码 # 获取通知返回参数,可参考接口文档中通知参数列表(以下仅供参考) respCode = params["respCode"] # 交易状态 if respCode == "00" or respCode == "A6": # 判断respCode=00、A6后,对涉及资金类的交易,请再发起查询接口查询,确定交易成功后更新数据库。 return result + "成功" else: return result + "fail" # 这里正常的通知不会执行到 else: # 服务器签名验证失败 return result + "验签失败"
def process_unionpay_query(order_id): req_params, req_url = get_query_form(order_id) if not req_params: error_msg = "找不到订单 {} 的信息".format(order_id) logging.error(error_msg) return False, error_msg resp_data = AcpService.post(req_params, req_url) logging.info(resp_data) if not validate_unionpay_data(resp_data): error_msg = "银联返回数据验证错误!" logging.error(error_msg) return False, error_msg return True, resp_data
def validate_unionpay_data(data_dict): return AcpService.validate(data_dict)
def get_payment_form_html(order_id): req_params, req_url = get_payment_form(order_id) return AcpService.createAutoFormHtml(req_params, req_url)