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

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

支付流程

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. 如果退款成功,则更新订单状态,并向用户发送退款成功的消息。如果退款失败,则向用户发送退款失败的消息。

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

阅读剩余 76%

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

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

相关文章

  • 对Java中传值调用的理解分析

    下面我会详细讲解“对Java中传值调用的理解分析”的完整攻略。 什么是传值调用 Java中,方法调用时参数的传递都是按值传递的,也就是说在调用方法时,实参把它的值传递给对应的形参,此时形参接收到的是实参值的一个拷贝,也就是说,无论实参是基本数据类型还是引用类型,形参变量都是对其值拷贝的一份副本进行操作,而无法修改实参变量的值。因此,Java中的传值调用又叫做…

    Java 2023年6月15日
    00
  • java中thread线程start和run的区别

    Java中,线程是程序的执行流,它是在进程中执行的。可以通过继承Thread类或实现Runnable接口来创建线程。在创建线程时,我们需要注意线程的生命周期。在Java中,线程的生命周期可以分为New、Runnable、Blocked、Waiting、Timed Waiting和Terminated这6种状态。 线程的启动是通过调用start方法来实现的;线…

    Java 2023年5月26日
    00
  • Java字节码插装的作用是什么?

    Java字节码插装是指在程序运行期间通过修改Java程序的字节码来达到修改程序行为和进行调试的目的。常见的字节码插装技术有Java Agent和AspectJ。 Java字节码插装的作用主要分为以下两个方面: 类加载时期修改类的字节码,在程序运行时对其进行增强 在程序运行时,通过对方法的字节码进行修改,实现将自己的代码嵌入到目标方法的中间或结尾位置 常见的应…

    Java 2023年5月11日
    00
  • 利用apache ftpserver搭建ftp服务器的方法步骤

    当您想要在本地或远程计算机上快速共享文件时,FTP服务器是一种非常有用的工具。Apache FTP服务器是一个优秀的FTP软件,拥有强大的安全功能,易于配置。 以下是利用Apache FTP服务器搭建FTP服务器的步骤,包括Linux和Windows系统。 在Linux上安装Apache FTP服务器 首先,确保Java已经安装。可以在命令行中运行 java…

    Java 2023年6月2日
    00
  • Java图形用户界面设计(Swing)的介绍

    Java图形用户界面设计(Swing)的介绍 概述 Java Swing 是一个GUI工具包由Sun Microsystems创建,它允许程序员使用Java创建图形用户界面(GUI)在基于Java的应用程序中。Swing是Java平台中一个独立于操作系统的 GUI 工具箱,适用于Java SE和Java EE平台。 特点 Java Swing是一个跨平台的G…

    Java 2023年5月24日
    00
  • Java的Struts框架报错“ViewHandlerException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ViewHandlerException”错误。这个错误通常由以下原因之一起: 视图处理器配置错误:如果配置文件中没有正确配置视图处理器,则可能会出现此错误。在这种情况下,需要检查文件以解决此问题。 视图文件不存在:如果视图文件不存在,则可能会出现此错误。在这种情况下,需要检查文件路径以解决此问题。 以下是两个…

    Java 2023年5月5日
    00
  • Java中char[]输出不是内存地址的原因详解

    题目:Java中char[]输出不是内存地址的原因详解 为什么Java中char[]数组的输出结果不是内存地址呢?这个问题很多Java初学者都会遇到,下面就给大家详细讲解Java中char[]数组的特性。 char[]数组在Java中的特性 Java中的char[]数组与其他基本数据类型数组一样,是一种在内存中开辟空间的一维数组,用来存储相应的数据。 cha…

    Java 2023年5月26日
    00
  • JavaScript中${pageContext.request.contextPath}取值问题及解决方案

    “JavaScript中${pageContext.request.contextPath}取值问题及解决方案”的完整攻略如下: 问题说明 在JSP页面中,如果要在JavaScript代码中获取当前web应用的上下文路径,一种常见的写法是${pageContext.request.contextPath}。例如,下面的代码展示了在JSP页面中如何使用该变量:…

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