Django1.11配合uni-app发起微信支付的实现

下面我将为您详细讲解“Django 1.11 配合 uni-app 发起微信支付的实现”的完整攻略。

一、前置条件

  1. 在微信公众平台中开通微信支付功能,并获得相关的 APP ID商户号支付密钥
  2. 安装 WxPayAPI,并将 WxPayAPI 放置在项目的根目录下;
  3. 在 Django 中安装 django-rest-framework(DRF) 和 djangorestframework-jwt(用户鉴权);
  4. 确保 uni-app 中已经安装了 uni.request 等必需的插件。

二、微信支付的 SDK 集成

  1. 将微信支付的 WxPayAPI 放置在 Django 项目的根目录下并引入 SDK

将后台收到的请求数据转成 XML 后传入微信支付的 SDK 里面,获取预支付订单信息,然后返回给前端。在 Django 项目的根目录下创建 wxpay 目录,将 WxPayAPI 中的 lib 文件夹以及 WxPay.Api.php 引入到 wxpay 目录下。然后,将 wxpay 目录加入到 settings.pyINSTALLED_APPS 中,以便后续的调用。

示例代码:

from wxpay.lib import *
from wxpay import *
@api_view(['POST'])
@permission_classes([IsAuthenticated])
def user_wxpay(request):
    """
    request.POST 包含以下字段:
        openid: 微信用户 openid
        out_trade_no: 商户订单号
        total_fee: 支付金额(单位:元)
        body: 订单描述
    """
    openid = request.POST.get('openid', '')
    out_trade_no = request.POST.get('out_trade_no', '')
    total_fee = request.POST.get('total_fee', '')
    body = request.POST.get('body', '')

    if not all([openid, out_trade_no, total_fee, body]):
        return Response({'errMsg': '请求参数不完整,请检查'}, status=status.HTTP_400_BAD_REQUEST)

    # 微信支付参数配置
    wxpay_conf = wxPayConfig(APPID, MCHID, KEY, APPSECRET, SSLCERT_PATH, SSLKEY_PATH)
    wxpay = WXPay(wxpay_conf)

    # 组装微信支付请求参数
    data = {
        'body': body,
        'out_trade_no': out_trade_no,
        'total_fee': int(float(total_fee) * 100),
        'spbill_create_ip': request.META.get('REMOTE_ADDR', '127.0.0.1'),
        'notify_url': NOTIFY_URL,
        'trade_type': 'JSAPI',
        'openid': openid,
    }

    # 调用微信支付 API 获取预支付订单信息
    result = wxpay.unifiedOrder(data)
    if result['return_code'] != 'SUCCESS' or result['result_code'] != 'SUCCESS':
        return Response({'errMsg': result['return_msg']}, status=status.HTTP_400_BAD_REQUEST)

    # 组装返回给前端的支付信息
    prepay_id = result['prepay_id']
    package = 'prepay_id=%s' % prepay_id
    timestamp = int(time.time())
    nonce_str = getNonceStr()
    sign = wxpay.getSign({
        'appId': APPID,
        'timeStamp': str(timestamp),
        'nonceStr': nonce_str,
        'package': package,
        'signType': 'MD5',
    })

    # 将支付相关信息返回给前端
    data = {
        'nonceStr': nonce_str,
        'package': package,
        'signType': 'MD5',
        'paySign': sign,
        'timeStamp': str(timestamp),
    }

    return Response(data)
  1. uni-app 中发起微信支付请求

前端将后台返回的支付参数组装成标准的微信支付格式,并调用 uni.request 发起微信支付请求。需要注意的是,在 uni.request 中设置 dataType: "xml"responseType: "text",以便保证返回内容的准确性。

示例代码:

<template>
  <view>
    <button @tap="pay">微信支付</button>
  </view>
</template>
<script>
  export default {
    methods: {
      pay() {
        const params = {
          openid: 'xxxx',
          out_trade_no: 'xxxx',
          total_fee: 0.01,
          body: '测试订单',
        }
        uni.request({
          url: 'https://your-api-url.com/user/wxpay/',
          method: 'POST',
          data: params,
          header: {
            'Authorization': `Bearer ${uni.getStorageSync('token')}`,
            'Content-Type': 'application/x-www-form-urlencoded'
          },
          dataType: 'xml',
          responseType: 'text',
          success: (res) => {
            console.log(res)
            const data = res.data
            uni.requestPayment({
              'timeStamp': data.timeStamp,
              'nonceStr': data.nonceStr,
              'package': data.package,
              'signType': data.signType,
              'paySign': data.paySign,
              success: (res) => {
                console.log(res)
              },
              fail: (res) => {
                console.log(res)
              }
            })
          },
          fail: (res) => {
            console.log(res)
          }
        })
      }
    }
  }
</script>

三、微信支付的接口测试

在以上的操作完成之后,可以调用微信支付的接口进行测试。由于微信支付是需要用到商户信息和微信支付账号等敏感信息的,所以建议在 DEBUG 模式下进行测试,以便快速完成测试。完成后,需要将代码中的 DEBUG 变量改为 False。

同时,在测试时还需要注意以下几点:

  • 在微信支付管理后台开启调试模式;
  • 在微信支付管理后台配置异步通知地址;
  • 将预支付订单号传入到微信的支付成功回调地址中。

以上就是关于“Django 1.11 配合 uni-app 发起微信支付的实现”的完整攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django1.11配合uni-app发起微信支付的实现 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • python 生成唯一id的四种方式

    当我们需要生成唯一的ID时,Python提供了多种方法可以做到这一点。以下是四种常见的方法: 方法一:使用 uuid 模块 Python内置了uuid模块,可以用于生成唯一的ID。示例代码如下: import uuid print(uuid.uuid1()) # 根据时间戳生成UUID print(uuid.uuid3(uuid.NAMESPACE_DNS,…

    人工智能概论 2023年5月24日
    00
  • ubuntu下 AndroidStudio4.1启动报错问题的解决

    针对”ubuntu下 AndroidStudio4.1启动报错问题的解决”这个问题,我提供以下完整攻略。 问题描述: 在Ubuntu操作系统中启动AndroidStudio4.1时,出现了报错,无法正常启动。具体的报错信息为: JDK Required: ‘tools.jar’ appears to be missing in ‘/usr/lib/jvm/j…

    人工智能概览 2023年5月25日
    00
  • OpenCV实现特征检测和特征匹配方法汇总

    OpenCV实现特征检测和特征匹配方法汇总 本文将介绍使用OpenCV实现特征检测和特征匹配的方法汇总。 特征检测 特征检测是基于图像对应的变化来寻找图像中的关键点的过程,这些关键点可以用来描述图像。OpenCV支持几种特征检测算法,包括:Harris Corner Detection、Shi-Tomasi Corner Detection、SIFT、SUR…

    人工智能概论 2023年5月25日
    00
  • django使用graphql的实例

    下面我将对“django使用graphql的实例”的完整攻略进行详细讲解。 什么是GraphQL GraphQL是一种用于API的查询语言,与REST等传统的API相比,它有以下优点: 可以精确地请求所需的数据,避免了传统API请求大量不需要的数据 支持多个查询和变更操作的批量请求 可以通过类型系统和查询架构自动文档化查询 Django中使用GraphQL的…

    人工智能概论 2023年5月25日
    00
  • 基于OpenCV自定义色条实现灰度图上色功能代码

    自定义色条是一个在图像处理中常用的功能,它可以把灰度图像上的灰度映射至不同的颜色上,从而实现更加直观的图像色彩表达。在OpenCV中可以基于LUT(Lookup Table)实现灰度图上色的功能,具体步骤如下: 创建颜色映射表LUT 首先需要创建一个颜色映射表LUT,这个LUT是一个256×1的彩色矩阵,它定义了当前灰度下的RGB颜色值,用于后续的灰度图像上…

    人工智能概论 2023年5月24日
    00
  • 利用Python实现自动化监控文件夹完成服务部署

    下面是利用Python实现自动化监控文件夹完成服务部署的完整攻略。 1. 需求分析 首先,我们需要明确这个服务部署的需求。假设我们有一个应用,需要部署到多个服务器上,每个服务器都有一个文件夹用于存放应用的文件。我们需要实现一个自动化的服务,可以监控指定的文件夹,并将最新的应用文件复制到所有的服务器上。 针对以上需求,我们需要完成以下步骤: 监控指定的文件夹 …

    人工智能概论 2023年5月25日
    00
  • django中使用Celery 布式任务队列过程详解

    下面是 “Django中使用Celery布局任务队列过程详解”的完整攻略: 什么是Celery? Celery是一个基于Python的分布式任务队列,它可以让您轻松地将工作分散到多个工作线程或分布式系统中。使用Celery可以让您将耗时或资源密集型任务从同步请求/响应循环中分离出来,使您的应用程序更加响应。 为什么要使用Celery? 在讨论如何使用Cele…

    人工智能概览 2023年5月25日
    00
  • 如何用nginx配置wordpress的方法示例

    下面是使用nginx配置WordPress的步骤和示例说明: 步骤一:安装nginx和PHP 首先在服务器上安装nginx和PHP。nginx是一个轻量级的HTTP服务器,可以作为Web服务器使用。PHP是一种流行的服务器端脚本语言,用于动态生成Web页面。 在Ubuntu上,可以使用以下命令安装nginx和PHP: sudo apt-get install…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部