使用支付宝沙箱演示支付宝支付

(1)使用python工具包,安装python-alipay-sdk,在窗口输入命令:pip install python-alipay-sdk --upgrade             从 1.3.0升级上来的用户, 请先卸载pycrypto:pip uninstall pycrypto

 (2) 运行代码:OpenSSL> genrsa -out app_private_key.pem   2048    生成一个私钥

(3) 运行代码:OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pe    导出公钥   

(4)然后退出     OpenSSL> exit

(5)打开支付宝开发里的沙箱,将生成的公钥粘贴到下面的位置里:



(6)然后查看支付宝公钥:


(7)然后在项目里做下图操作:

公钥里:将支付宝公钥粘贴进去(两行索引不能省略) 

私钥可以从自动生成文档的粘贴到项目下(如下图所示):

(8)然后到支付接口:

自己在提交设置一个click事件,并且判断下状态.

(9)在views里添加方法:

class OrderPayView(View):
    """订单支付"""
    def post(self, request):
        user = request.user
        if not user.is_authenticated():
            return JsonResponse({"res": 0, "errmsg": "用户未登录"})

        order_id = request.POST.get('order_id')
        if not order_id:
            return JsonResponse({"res": 1, "errmsg": "无效的订单id"})
        try:
            print('order_id:%s'%order_id)
            order = OrderInfo.objects.get(order_id = order_id,
                                            user = user,
                                            pay_method=3,
                                            order_status=1)
        except OrderInfo.DoesNotExist:
            return JsonResponse({"res": 2, "errmsg": "订单错误"})



        app_private_key_string = os.path.join(settings.BASE_DIR, 'order/app_private_key.pem')
        alipay_public_key_string = os.path.join(settings.BASE_DIR, 'order/alipay_public_key.pem')


        alipay = AliPay(
            appid="2016091900545752",
            app_notify_url=None,  # 默认回调url
            app_private_key_path=app_private_key_string,
            alipay_public_key_path=alipay_public_key_string,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            sign_type="RSA2", # RSA 或者 RSA2
            debug = True  # 默认False
        )


        subject = "天天生鲜订单-%s"%order.order_id
        total_pay = order.total_price + order.transit_price

        order_string = alipay.api_alipay_trade_page_pay(
            out_trade_no=order_id,
            total_amount=str(total_pay),
            subject=subject,
            return_url=None,
            notify_url=None  # 可选, 不填则使用默认notify url
        )

        pay_url = 'https://openapi.alipaydev.com/gateway.do?' + order_string
        return JsonResponse({"res": 3, "pay_url": pay_url})

 最后重新启动服务器,运行即可

前端需要提交必要的信息,如提交的状态啊和IP,提交状态实在models里提前设置好的:


<script type="text/javascript" src="/static/js/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
    $('.oper_btn').each(function (i, v) {
        //获取支付状态
        status = $(this).attr('status')
        if (status == 1){
            $(this).text('去支付')
            $('[class="col02 stress"]').eq(i).text('未支付')
            $(this).parent().prev().text('待付款')
        }
        else if (status == 4){
            $(this).text('去评价')
        }
        else if (status == 5){
            $(this).text('已完成')
        }

    })

    $('.oper_btn').click(function () {
        //获取status
        status = $(this).attr('status')
        //获取订单ip
        order_id = $(this).attr('order_id')
        if (status == 1){
            //进行支付
            csrf = $('input[name = "csrfmiddlewaretoken"]').val()
            //组织参数
            params = {'order_id': order_id, 'csrfmiddlewaretoken': csrf}
            //发起ajax post请求,访问/order/pay,传递参数:order_id
            $.post('/order/pay', params , function (data) {
                if (data.res == 3){
                    //引导用户到支付界面
                    window.open(data.pay_url)
                }
                else {
                    alert(data.errmsg)
                }
            })
        }
        return false
    })
</script>

models里的设置以数字来代替支付状态,提高效率:

class OrderInfo(BaseModel):
    PAY_METHOD_CHOICES =(
        (1, "货到付款"),
        (2, "微信支付"),
        (3, "支付宝"),
        (4, "银联支付")
    )

    ORDER_STATUS_CHOICES =(
        (1, "待支付"),
        (2, "待发货"),
        (3, "待收货"),
        (4, "待评价"),
        (5, "已完成")
    )

    order_id = models.CharField(max_length=128, primary_key=True, verbose_name="订单id")
    user = models.ForeignKey("Freshproject.UserRegister", verbose_name="用户")
    addr = models.ForeignKey("Freshproject.Address", verbose_name="地址")
    pay_method = models.SmallIntegerField(choices=PAY_METHOD_CHOICES, default=3, verbose_name="支付方式")
    #冗余
    total_count = models.IntegerField(default=1, verbose_name="商品数量")
    total_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="商品总价")
    transit_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="订单运费")
    order_status = models.SmallIntegerField(choices=ORDER_STATUS_CHOICES, default=1, verbose_name="订单状态")
    trade_no = models.CharField(max_length=128, default='', verbose_name="支付编号")

    class Meta:
        db_table = 'df_order_info'
        verbose_name = '订单'
        verbose_name_plural = verbose_name


class OrderGoods(BaseModel):
    order = models.ForeignKey("OrderInfo", verbose_name="订单")
    sku = models.ForeignKey("goods.GoodsSKU", verbose_name="商品SKU")
    count = models.IntegerField(default=1, verbose_name="商品数目")
    price = models.DecimalField(max_digits=10, decimal_places=2,verbose_name="商品价格")

    class Meta:
        db_table = "df_order_goods"
        verbose_name = "订单商品"
        verbose_name_plural = verbose_name

最后就可以演示操作了,支付时候会自动匹配设置好的url跳转支付界面,不过一般会被浏览器以广告骚扰拦截:


不过不要紧,你打开就可以发现支付页面了:







猜你喜欢

转载自blog.csdn.net/lzz781699880/article/details/81045135