支付功能

2019-02-27  本文已影响43人  唯老

一、前期准备工作

1、注册开发者账号

官方网站

2、注册应用

  1. 选择开发接入
  2. 选择支付应用
  3. 选择立即接入
  4. 创建应用
  5. 应用配置
  1. 配置完成之后提交审核

3、沙箱模式(测试环境)

  1. 示例图


    image
    image
  2. 说明
    跟正式应用配置一样

4、秘钥文件

  1. 生成秘钥
    openssl
    OpenSSL> genrsa -out app_private_key.pem   2048  # 私钥
    OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem # 导出公钥
    OpenSSL> exit
    
  2. 示例图


    image
  3. 格式
    -----BEGIN RSA PRIVATE KEY-----
    ...
    -----END RSA PRIVATE KEY-----
    
    -----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv4ThJ/BbFeOHRk/u/Weu
    ctZ/2+X9jOycC+axnwEkq78Bh6yAPywztlyLMbJ6ptKSnhtKg6g/hTZYiQTrcZrd
    MqWB/g3Sof/atrszV3OBUsA8W1JmszwtJgrDw+FtMlROjcE/3LJxqoT7NYZ2rPkp
    ki0iG1gk6VGNdwB9xPwY30xLf4tDNZ9j7tVA9aLqcUOOnaK/AQxOt3kaa3cWzQDx
    lmfiWP0+hyEirWyZqLmZlcPpbvZv2sJaVJze7zNFfnCLRPWmJt95z19rvHJDUkAp
    xI7NxqM6tklJ1BJcmM5IVA61bzzA6HkYSZEPy/wgKElZAp1Im2DM4M7kArkP4+eW
    dwIDAQAB
    -----END PUBLIC KEY-----
    

二、开发

1、安装

  1. 说明
    因为python没有集成支付宝的sdk,安装第三方的包 python-alipay-sdk
    GitHub地址
  2. 命令
    pip install  python-alipay-sdk
    

2、项目配置

  1. 将生成的公钥私钥文件复制到项目中 例如
    [图片上传失败...(image-d523b2-1551262489559)]
  2. 在项目setting


    image

3、发起支付

  1. views.py
    def pay(request):
        # 创建用于进行支付宝支付的工具对象
        alipay = AliPay(
            appid=settings.APP_ID,
            app_notify_url=None,  # 默认回调url
            app_private_key_string=settings.APP_PRIVATE_STRING,
            alipay_public_key_string=settings.ALIPAY_PUBLIC_KEY_STRING,
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            debug=True  # 默认False  配合沙箱模式使用
        )
        # 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string
        order_string = alipay.api_alipay_trade_page_pay(
          # 订单号
            out_trade_no='123456',
            # 商品总价
            total_amount=str(0.01),  # 将Decimal类型转换为字符串交给支付宝
            # 订单标题
            subject="天猫商城-{}".format(123456),
            # 支付成功之后 前端跳转的界面
            return_url='https://baidu.com/', 
            # 支付成功后台跳转接口
            notify_url=None  # 可选, 不填则使用默认notify url
        )
        # 让用户进行支付的支付宝页面网址
        url = settings.ALI_PAY_URL + "?" + order_string
        return redirect(url)
    
  2. 跳转支付宝支付界面


    image
    image
  3. 备注
    在安卓手机上下载


    image

    在沙箱账号一栏有测试账号


    image

4、支付成功回调

  1. 支付成功回调方法
    @csrf_exempt
    def aliapy_back_url(request):
       pass
    
  2. 支付宝回传数据格式
    # 验证alipay的异步通知,data来自支付宝回调POST 给你的data,字典格式.
    data = {
         "subject": "测试订单",
         "gmt_payment": "2016-11-16 11:42:19",
         "charset": "utf-8",
         "seller_id": "xxxx",
         "trade_status": "TRADE_SUCCESS",
         "buyer_id": "xxxx",
         "auth_app_id": "xxxx",
         "buyer_pay_amount": "0.01",
         "version": "1.0",
         "gmt_create": "2016-11-16 11:42:18",
         "trade_no": "xxxx",
         "fund_bill_list": "[{\"amount\":\"0.01\",\"fundChannel\":\"ALIPAYACCOUNT\"}]",
         "app_id": "xxxx",
         "notify_time": "2016-11-16 11:42:19",
         "point_amount": "0.00",
         "total_amount": "0.01",
         "notify_type": "trade_status_sync",
         "out_trade_no": "xxxx",
         "buyer_logon_id": "xxxx",
         "notify_id": "xxxx",
         "seller_email": "xxxx",
         "receipt_amount": "0.01",
         "invoice_amount": "0.01",
         "sign": "xxx"
    }
    signature = data.pop("sign")
    success = alipay.verify(data, signature)
    if success and data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED" ):
        print("trade succeed")
    

5、取消订单

  1. views.py
    def cancel_order(out_trade_no:int, cancel_time=None):
        '''
        撤销订单
        :param out_trade_no:
        :param cancel_time: 撤销前的等待时间(若未支付),撤销后在商家中心-交易下的交易状态显示为"关闭"
        :return:
        '''
        result = alipay.api_alipay_trade_cancel(out_trade_no=out_trade_no)
        resp_state = result.get('msg')
        action = result.get('action')
        if resp_state=='Success':
            if action=='close':
                if cancel_time:
                    print("%s秒内未支付订单,订单已被取消!" % cancel_time)
            elif action=='refund':
                print('该笔交易目前状态为:',action)
            return action
        else:
            print('请求失败:',resp_state)
    

6、退款操作

  1. 示例代码
    def need_refund(out_trade_no:str or int, refund_amount:int or float, out_request_no:str):
        '''
        退款操作
        :param out_trade_no: 商户订单号
        :param refund_amount: 退款金额,小于等于订单金额
        :param out_request_no: 商户自定义参数,用来标识该次退款请求的唯一性,可使用 out_trade_no_退款金额*100 的构造方式
        :return:
        '''
        result = init_alipay_cfg().api_alipay_trade_refund(out_trade_no=out_trade_no,
                                                           refund_amount=refund_amount,
                                                           out_request_no=out_request_no)
        if result["code"] == "10000":
            return result  #接口调用成功则返回result
        else:
            return result["msg"] #接口调用失败则返回原因
    
    def refund_query(out_request_no:str, out_trade_no:str or int):
        '''
        退款查询:同一笔交易可能有多次退款操作(每次退一部分)
        :param out_request_no: 商户自定义的单次退款请求标识符
        :param out_trade_no: 商户订单号
        :return:
        '''
        result = alipay.api_alipay_trade_fastpay_refund_query(out_request_no, out_trade_no=out_trade_no)
        if result["code"] == "10000":
            return result  #接口调用成功则返回result
        else:
    

上一篇 下一篇

猜你喜欢

热点阅读