微信小程序支付及退款流程详解

微信小程序支付及退款流程详解

支付流程

1. 获取openid

在发起支付前,需要获取用户的openid。可以通过调用微信官方提供的登录接口wx.login(),在获取到临时登录凭证code后,再通过调用wx.request()接口向服务器发送请求,从而获取用户的openid。

示例代码:

wx.login({
  success: function(res) {
    if (res.code) {
      wx.request({
        url: 'https://api.weixin.qq.com/sns/jscode2session',
        data: {
          appid: 'YOUR_APP_ID',
          secret: 'YOUR_APP_SECRET',
          js_code: res.code,
          grant_type: 'authorization_code'
        },
        success: function(res) {
          console.log(res.data)
          // 获取openid
          var openid = res.data.openid;
        }
      })
    } else {
      console.log('登录失败!' + res.errMsg)
    }
  }
})

2. 创建订单

创建订单需要向自己的后台服务器发送请求,由后台服务器调用微信支付统一下单接口,返回预付单信息。

示例代码:

// 向微信支付统一下单接口发送请求
$post_data = array(
    'appid' => 'YOUR_APP_ID',
    'mch_id' => 'YOUR_MCH_ID',
    'nonce_str' => '随机字符串',
    'body' => '商品描述',
    'out_trade_no' => '商户订单号',
    'total_fee' => '订单金额',
    'spbill_create_ip' => $_SERVER['REMOTE_ADDR'],
    'notify_url' => '支付结果通知url',
    'trade_type' => 'JSAPI',
    'openid' => $openid
);
$post_data['sign'] = sign($post_data, 'YOUR_APP_KEY');

$xml = arrayToXml($post_data);
$response = postXmlCurl('https://api.mch.weixin.qq.com/pay/unifiedorder', $xml);

// 解析微信支付统一下单接口返回的结果
$result = xmlToArray($response);
if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {
    // 获取预支付交易会话标识
    $prepay_id = $result['prepay_id'];
    $nonceStr = createNonceStr();

    // 生成签名
    $data = array(
        'appId' => 'YOUR_APP_ID',
        'timeStamp' => strval(time()),
        'nonceStr' => $nonceStr,
        'package' => 'prepay_id=' . $prepay_id,
        'signType' => 'MD5'
    );
    $data['paySign'] = sign($data, 'YOUR_APP_KEY');

    // 将支付参数返回给小程序
    echo json_encode($data);
} else {
    echo $result['return_msg'];
}

3. 发起支付

通过wx.requestPayment()接口发起支付。

示例代码:

wx.requestPayment({
  timeStamp: '',
  nonceStr: '',
  package: '',
  signType: 'MD5',
  paySign: '',
  success: function(res) {
    console.log('支付成功!')
  }
})

退款流程

1. 创建退款订单

在小程序后台管理界面设置退款规则,用户申请退款后,小程序会向自己的后台服务器发送请求,由后台服务器调用微信支付申请退款接口,返回退款结果。

示例代码:

// 向微信支付申请退款接口发送请求
$post_data = array(
    'appid' => 'YOUR_APP_ID',
    'mch_id' => 'YOUR_MCH_ID',
    'nonce_str' => '随机字符串',
    'out_trade_no' => '商户订单号',
    'out_refund_no' => '商户退款单号',
    'total_fee' => '订单金额',
    'refund_fee' => '退款金额',
    'refund_desc' => '退款原因',
    'refund_account' => '退款资金来源',
);
$post_data['sign'] = sign($post_data, 'YOUR_APP_KEY');

$xml = arrayToXml($post_data);
$response = postXmlCurl('https://api.mch.weixin.qq.com/secapi/pay/refund', $xml);

// 解析微信支付申请退款接口返回的结果
$result = xmlToArray($response);
if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {
    echo '退款成功';
} else {
    echo $result['return_msg'];
}

2. 查询退款订单状态

调用微信支付查询退款接口查询退款订单状态。

示例代码:

// 向微信支付查询退款接口发送请求
$post_data = array(
    'appid' => 'YOUR_APP_ID',
    'mch_id' => 'YOUR_MCH_ID',
    'nonce_str' => '随机字符串',
    'out_trade_no' => '商户订单号',
);
$post_data['sign'] = sign($post_data, 'YOUR_APP_KEY');

$xml = arrayToXml($post_data);
$response = postXmlCurl('https://api.mch.weixin.qq.com/pay/orderquery', $xml);

// 解析微信支付查询退款接口返回的结果
$result = xmlToArray($response);
if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {
    if ($result['refund_status_0'] == 'SUCCESS') {
        echo '退款成功';
    } else {
        echo '退款失败';
    }
} else {
    echo $result['return_msg'];
}

示例说明

支付流程

假如某个用户在你的小程序中购买了一件商品,价格为99元,订单号为1234567890。那么支付流程如下:

  1. 用户点击“立即购买”按钮,小程序调用wx.login()接口,获取用户的openid。

  2. 小程序向自己的后台服务器发送请求,由后台服务器调用微信支付统一下单接口,返回预付单信息。预付单信息中包含了相关的支付参数,如:时间戳、随机字符串、预支付交易会话标识等。

  3. 小程序通过wx.requestPayment()接口发起支付,用户需要输入密码完成支付。

  4. 支付成功后,微信服务器通知小程序的服务器支付成功的消息,并携带支付订单信息。

  5. 小程序的后台服务器收到支付成功的消息后,更新订单状态,并向用户发送支付成功的消息。

退款流程

假如某个用户购买了你的小程序中的一件商品,并申请退款。那么退款流程如下:

  1. 用户在小程序中申请退款,小程序会向自己的后台服务器发送请求。

  2. 后台服务器调用微信支付申请退款接口,返回退款结果。

  3. 后台服务器调用微信支付查询退款接口,查询退款订单状态。

  4. 如果退款成功,则更新订单状态,并向用户发送退款成功的消息。如果退款失败,则向用户发送退款失败的消息。

以上就是微信小程序支付及退款流程的详细攻略。希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微信小程序支付及退款流程详解 - Python技术站

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

相关文章

  • 关于log4j漏洞修复解决方案及源码编译

    关于log4j漏洞修复解决方案及源码编译,我会给出下面的完整攻略。 1. 了解Log4j漏洞 最近,Log4j2.0这个常用的Java日志框架出现了一个安全漏洞,攻击者可以通过构造恶意代码的方式,远程执行任意命令。此漏洞受到了国内外广泛关注,因此及时修复这个漏洞变得尤为必要。 2. 解决方案 下面就是在Windows环境下解决这个问题的步骤。 2.1 检查是…

    Java 2023年5月19日
    00
  • Java struts2 validate用户登录校验功能实现

    下面是Java struts2 validate用户登录校验功能实现的完整攻略。 准备工作 确保本地安装了Java和Struts2框架 创建项目目录和基本的MVC架构 实现步骤 1. 创建登录表单和登录处理Action类 在jsp页面中创建登录表单,包括用户名和密码两个输入框。然后在后台Action类中编写处理登录请求的方法,通过接收表单中提交的参数,将其传…

    Java 2023年5月20日
    00
  • 基于java swing实现答题系统

    基于Java Swing实现答题系统的攻略 策划和设计 在开发答题系统之前,需要做好策划和设计。首先需要定义项目的基本要求和功能,并进行详细的规划和设计。这包括创建用于存储题目和答案的数据库,定义系统的用户角色和权限等。 系统架构设计 设计完答题系统的功能后,需要进行系统架构设计。这包括确定使用的技术栈和架构模式,例如使用MVC(Model-View-Con…

    Java 2023年5月19日
    00
  • JSON复杂数据处理之Json树形结构数据转Java对象并存储到数据库的实现

    下面是详细的攻略: JSON复杂数据处理之Json树形结构数据转Java对象并存储到数据库的实现 背景介绍 JSON是一种轻量级的数据交换格式,常用于Web应用中的数据传输。在实际开发中,我们常常需要将JSON数据转换为Java对象,并将这些对象存储到数据库中。而JSON数据可能比较复杂,包含嵌套的数据结构,如树形结构数据。因此,本篇攻略将介绍如何使用Jav…

    Java 2023年5月26日
    00
  • Java设计模式之java装饰者模式详解

    Java设计模式之装饰者模式详解 什么是装饰者模式? 装饰者模式又叫包装模式,它是一种结构型设计模式。装饰者模式可以在运行时给对象动态添加一些额外的职责,而不影响该对象的行为。其实我们在生活中也经常使用到装饰者模式,比如将一个普通房间粉刷成卧室或客厅,这样就给房间添加了额外的功能,而且不会影响原有房间的结构和功能。 装饰者模式的角色和实现方式 装饰者模式有如…

    Java 2023年5月26日
    00
  • UML类图

    UML类图介绍 概念 UML中的类图(Class Diagram)用于表示类、接口、实例等之间相互的静态关系。虽然名字叫作类图,但是图中并不仅仅只有类。 类结构 继承 该图展示了Parentclass和Childclass两个类之间的关系,其中的空心箭头表明了两者之间的层次关系。箭头由子类指向父类,换言之,这是表示继承(extends)的箭头。ParentC…

    Java 2023年4月22日
    00
  • jQuery老黄历完整实现方法

    jQuery老黄历完整实现方法 简介 jQuery老黄历是一款对于时间的格式化呈现的插件,可以生成比较形象化的日期解释,比如”今天是个好日子,宜开发,宜部署”。 完整实现方法 要实现jQuery老黄历的功能,需要完成以下步骤: 步骤1:引入jQuery和老黄历脚本 首先,需要在HTML文件的<head>标签内引入jQuery和老黄历的脚本: &l…

    Java 2023年5月23日
    00
  • 浅谈java中字符串数组、字符串、整形之间的转换

    浅谈Java中字符串数组、字符串、整形之间的转换 在Java开发中,字符串数组、字符串和整形的相互转换是非常常见的操作。本攻略将详细介绍不同类型的数据之间的转换方法。 字符串数组和字符串的转换 将字符串数组转换为字符串 我们可以使用Java提供的String.join()方法将字符串数组转换成一个字符串。该方法将数组元素连接为一个字符串,每个元素之间插入指定…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部