zoukankan      html  css  js  c++  java
  • 支付宝支付

    支付宝支付:#

    下载alipay支付接口demo:

    链接: https://pan.baidu.com/s/1VEIMspzSaje63NKGle3_lw 提取码: pt9z 
    AlipayDemo

    使用支付宝支付需要有个商户号,这个商户号必须是企业申请,并且需要企业的营业执照:申请完了会给你个商户号 (一串数字)  

    沙箱环境(沙箱环境)

    https://openhome.alipay.com/platform/appDaily.htm?tab=info

    点击支付后会向支付宝网关发送请求,应该在网关后面拼接用户支付相关信息,而这个信息需要进行加密才安全

    加密方式:

    对称加密:加密密钥和解密密钥用的是同一个

    非对称加密:加密和解密的密钥不同,公钥可以随意分发,但是私钥一定不能泄露

    安装模块:

    pip3 install pycryptodome     加密解密模块

    支付宝支付流程:

    在网页端点击支付宝支付,跳转到支付宝支付页面,扫码支付完成,商家支付宝收到钱,支付宝给当前网页发送一个请求,告诉商家用户已付款成功了,然后商家就可以把订单状态改成已支付。

    使用:alipayDemo来配置支付宝支付接口

    1  拿到商户号,回调地址(支付成功跳转到自己服务器上,get请求(支付成功)和post请求(修改订单)),支付宝公钥,我的私钥---生成一个对象(AliPay)

    # 给支付宝发请求,信息要用支付宝公钥加密

    # 支付宝给我响应信息,信息会用商户的公钥加密,回来之后再拿用户私钥解密

    2 对象.direct_pay 传支付金额,支付商品描述,支付订单号---返回个加密的串(把前面参数加密了)
    3 拿到加密的串拼到get请求参数部分pay_url = "https://openapi.alipaydev.com/gateway.do?{}".format(query_params)
    4 重定向到该地址(向该地址发送get请求)
    5 用户付款,付款成功支付宝会给我发送两个请求,一个是get请求,一个是post请求
    6 咱们的程序需要处理这两个回调请求(请求回来需要验证签名)
     -get请求一般用于页面展示
     -post请求用于修改订单状态
    -项目中需要配置:公钥私钥生成方式:https://docs.open.alipay.com/291/105971
    -支付宝公钥:商户号中输入的应用公钥,会自动生成一个支付宝公钥,把它粘贴过来
    -应用私钥(用户私钥)
    -支付宝回调返回数据中会有:
    -singn:必须验证签名,验证通过才能进行后续的修改
    -订单id
    -根据订单id修改订单状态
    -如果用户付款了,但是你服务挂掉了?
    -如果服务挂掉了,支付宝过一会会自动在回调(24内,隔一段时间就会回调),重启服务器即可

    复制代码
    from django.shortcuts import render, redirect, HttpResponse
    

    from myutils.pay import AliPay
    import json
    import time
    def ali():
    # 沙箱环境地址:https://openhome.alipay.com/platform/appDaily.htm?tab=info
    app_id = "2016100100640466"
    # 支付宝收到用户的支付,会向商户发两个请求,一个get请求,一个post请求
    # POST请求,用于最后的检测
    notify_url = "http://129.211.26.50/page2/"
    # GET请求,用于页面的跳转展示
    return_url = "http://129.211.26.50/page2/"
    # 用户私钥
    merchant_private_key_path = "keys/app_private_2048.txt"
    # 支付宝公钥
    alipay_public_key_path = "keys/alipay_public_2048.txt"
    # 生成一个AliPay的对象
    alipay = AliPay(
    appid
    =app_id, # 商户号
    app_notify_url=notify_url, # POST请求,用于最后的检测
    return_url=return_url, # GET请求,用于页面的跳转展示
    app_private_key_path=merchant_private_key_path, # 用户私钥
    alipay_public_key_path=alipay_public_key_path, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥
    debug=True, # 默认False,

    )
    return alipay

    def page1(request):
    if request.method == "GET":

        </span><span style="color: #0000ff;">return</span> render(request, <span style="color: #800000;">'</span><span style="color: #800000;">page1.html</span><span style="color: #800000;">'</span><span style="color: #000000;">)
    </span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
        money </span>= float(request.POST.get(<span style="color: #800000;">'</span><span style="color: #800000;">money</span><span style="color: #800000;">'</span><span style="color: #000000;">))
        </span><span style="color: #008000;">#</span><span style="color: #008000;"> 生成一个对象</span>
        alipay =<span style="color: #000000;"> ali()
        </span><span style="color: #008000;">#</span><span style="color: #008000;"> 生成支付的url</span>
        <span style="color: #008000;">#</span><span style="color: #008000;"> 对象调用direct_pay</span>
        <span style="color: #008000;">#</span><span style="color: #008000;"> 该方法生成一个加密串</span>
        query_params =<span style="color: #000000;"> alipay.direct_pay(
            subject</span>=<span style="color: #800000;">"</span><span style="color: #800000;">充气娃娃</span><span style="color: #800000;">"</span>,  <span style="color: #008000;">#</span><span style="color: #008000;"> 商品简单描述</span>
            out_trade_no=<span style="color: #800000;">"</span><span style="color: #800000;">x2</span><span style="color: #800000;">"</span> + str(time.time()),  <span style="color: #008000;">#</span><span style="color: #008000;"> 商户订单号</span>
            total_amount=money,  <span style="color: #008000;">#</span><span style="color: #008000;"> 交易金额(单位: 元 保留俩位小数)</span>
    

    )

        pay_url </span>= <span style="color: #800000;">"</span><span style="color: #800000;">https://openapi.alipaydev.com/gateway.do?{}</span><span style="color: #800000;">"</span><span style="color: #000000;">.format(query_params)
        </span><span style="color: #0000ff;">print</span><span style="color: #000000;">(pay_url)
        </span><span style="color: #008000;">#</span><span style="color: #008000;"> 朝这个地址发get请求</span>
        <span style="color: #008000;">#</span><span style="color: #008000;"> from django.http import JsonResponse</span>
        <span style="color: #008000;">#</span><span style="color: #008000;"> return JsonResponse({'status':100,'url':pay_url})</span>
        <span style="color: #0000ff;">return</span><span style="color: #000000;"> redirect(pay_url)
    

    def page2(request):
    # 支付宝如果收到用户的支付,支付宝会给我的地址发一个post请求,一个get请求
    alipay = ali()
    if request.method == "POST":
    # 检测是否支付成功
    # 去请求体中获取所有返回的数据:状态/订单号
    from urllib.parse import parse_qs
    body_str
    = request.body.decode('utf-8')
    print(body_str)

        post_data </span>=<span style="color: #000000;"> parse_qs(body_str)
        </span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">'</span><span style="color: #800000;">支付宝给我的数据:::---------</span><span style="color: #800000;">'</span><span style="color: #000000;">,post_data)
        post_dict </span>=<span style="color: #000000;"> {}
        </span><span style="color: #0000ff;">for</span> k, v <span style="color: #0000ff;">in</span><span style="color: #000000;"> post_data.items():
            post_dict[k] </span>=<span style="color: #000000;"> v[0]
        </span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">'</span><span style="color: #800000;">转完之后的字典</span><span style="color: #800000;">'</span><span style="color: #000000;">,post_dict)
        </span><span style="color: #008000;">#</span><span style="color: #008000;"> 做二次验证</span>
        sign = post_dict.pop(<span style="color: #800000;">'</span><span style="color: #800000;">sign</span><span style="color: #800000;">'</span><span style="color: #000000;">, None)
        </span><span style="color: #008000;">#</span><span style="color: #008000;"> 通过调用alipay的verify方法去认证</span>
        status =<span style="color: #000000;"> alipay.verify(post_dict, sign)
    
        </span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">'</span><span style="color: #800000;">POST验证</span><span style="color: #800000;">'</span><span style="color: #000000;">, status)
        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> status:
            </span><span style="color: #008000;">#</span><span style="color: #008000;"> 修改自己订单状态</span>
            <span style="color: #0000ff;">pass</span>
        <span style="color: #0000ff;">return</span> HttpResponse(<span style="color: #800000;">'</span><span style="color: #800000;">POST返回</span><span style="color: #800000;">'</span><span style="color: #000000;">)
    
    </span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
        params </span>=<span style="color: #000000;"> request.GET
        sign </span>= params.pop(<span style="color: #800000;">'</span><span style="color: #800000;">sign</span><span style="color: #800000;">'</span><span style="color: #000000;">, None)
        status </span>=<span style="color: #000000;"> alipay.verify(params, sign)
        </span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">'</span><span style="color: #800000;">GET验证</span><span style="color: #800000;">'</span><span style="color: #000000;">, status)
        </span><span style="color: #0000ff;">return</span> HttpResponse(<span style="color: #800000;">'</span><span style="color: #800000;">支付成功</span><span style="color: #800000;">'</span>)</pre>
    
    复制代码

    注意:

    最后将支付宝支付项目文件打包到服务器,解压后运行python3 manage.py runserver 0.0.0.0:8004,端口自己写,启动支付宝支付项目

    浏览器输入page1路由进行支付页面,提交跳到二维码支付页面page2,支付扫码成功页面会自动跳转,提示支付成功. 

  • 相关阅读:
    “使用Adobe Reader XI打开PDF文件,左侧无法显示导航列表”解决方法
    水平垂直居中——子元素水平垂直居中于父元素
    Git概念、命令及项目部署(另外补充常用的Linux命令)
    在VSCode中使用Markdown
    Sublime Text3中MarkDown的使用
    <el-table>序号逐次增加,翻页时继续累加,解决翻页时从编号1开始的情况
    Visio2016专业版永久激活码
    ElementUI的Loading组件 —— 想实现在请求后台数据之前开启Loading组件,请求成功或失败之后,关闭Loading组件
    HTML5新特性
    FCC知识点总结
  • 原文地址:https://www.cnblogs.com/jinhongquan/p/12087859.html
Copyright © 2011-2022 走看看