Exemple #1
0
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 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 trade():
    req = {}

    req["version"] = SDKConfig().version
    req["encoding"] = SDKConfig().encoding
    req["signMethod"] = "01"

    req["txnType"] = "78"
    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"
    req["accNo"] = AcpService.encryptData("6226090000000048")
    req["encryptCertId"] = AcpService.getEncryptCertId()

    # 签名示例
    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 "customerInfo" in resp:
            customerInfo = AcpService.parseCustomerInfo(
                resp["customerInfo"],
                SDKConfig().signCertPath,
                SDKConfig().signCertPwd)
            if "phoneNo" in customerInfo:
                result = result + "phoneNo=" + customerInfo[
                    "phoneNo"] + "<br>\n"

    return result
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
Exemple #5
0
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})
Exemple #7
0
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
Exemple #8
0
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
Exemple #9
0
def validate_unionpay_data(data_dict):
    return AcpService.validate(data_dict)