微信小程序 支付后台java实现实例

下面是详细讲解“微信小程序 支付后台java实现实例”的完整攻略。

一、前置条件

在进行微信小程序支付后台java实现之前,需要先满足以下条件:

  1. 在微信公众平台上注册了小程序,并且通过了认证。
  2. 微信支付需要使用开通微信支付服务的普通商户号,且已完成相关配置。
  3. 开发人员需要了解基本的java开发知识。

二、参考代码

参考代码中使用了SpringBoot框架和Maven工具进行开发,示例中仅包含微信小程序支付的功能实现。

  1. pom.xml中添加依赖
<dependency>
    <groupId>cn.binarywang</groupId>
    <artifactId>weixin-java-pay</artifactId>
    <version>3.0.0.RELEASE</version>
</dependency>
  1. 在application.yml中配置相关参数
wx:
  pay:
    appId: wx*************            # 小程序appId
    mchId: 1********                  # 商户号
    mchKey: *********************************    # 商户api密钥
    notifyUrl: http://www.example.com/pay/notify     # 支付成功回调url
  1. 创建统一下单接口
package com.example.demo;

import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

@RestController
public class PayController {
    @Autowired
    private HttpServletRequest request;
    @Autowired
    private WxPayServiceImpl wxPayService;

    @PostMapping("/unifiedOrder")
    public Map<String, String> unifiedOrder() {
        Map<String, String> resultMap = new HashMap<>();
        String body = "测试商品";  // 商品描述
        String outTradeNo = "test_" + System.currentTimeMillis();  // 商户订单号
        String totalFee = "1";  // 总金额,单位为分
        String clientIp = getClientIp();  // 客户端ip

        try {
            WxPayService wxPayService = new WxPayServiceImpl();
            wxPayService.setConfig(wxPayConfig);

            // 设置统一下单参数
            WxPayUnifiedOrderRequest request = WxPayUnifiedOrderRequest.newBuilder()
                    .body(body)
                    .outTradeNo(outTradeNo)
                    .totalFee(totalFee)
                    .spbillCreateIp(clientIp)
                    .notifyUrl(wxPayConfig.getNotifyUrl())
                    .tradeType(WxPayConstants.TradeType.JSAPI)
                    .openid(request.getParameter("openid"))
                    .build();

            // 统一下单
            WxPayUnifiedOrderResult result = wxPayService.unifiedOrder(request);
            Map<String, String> jsApiPayMap = wxPayService.getPayInfo(result, false);

            resultMap.put("appId", wxPayConfig.getAppId());
            resultMap.put("timeStamp", String.valueOf(System.currentTimeMillis()));
            resultMap.putAll(jsApiPayMap);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resultMap;
    }

    private String getClientIp(){
        String ip = request.getHeader("X-Real-IP");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("X-Forwarded-For");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;
    }
  1. 创建支付成功回调接口
package com.example.demo;

import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

@RestController
public class NotifyController {
    @Autowired
    private HttpServletRequest request;
    @Autowired
    private WxPayServiceImpl wxPayService;

    @PostMapping("/pay/notify")
    public String notify(HttpServletRequest request){
        StringBuffer sb = new StringBuffer();

        //读取请求内容
        try(InputStream inputStream = request.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader)){
            String str = "";
            while (null != (str = bufferedReader.readLine())) {
                sb.append(str);
            }
            bufferedReader.close();
            inputStreamReader.close();
            inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        String result = sb.toString();
        try {
            WxPayService wxPayService = new WxPayServiceImpl();
            wxPayService.setConfig(wxPayConfig);

            // 解析微信通知结果
            WxPayOrderNotifyResult notifyResult = wxPayService.parseOrderNotifyResult(result);

            // 处理业务逻辑

            return "SUCCESS";
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "FAIL";
    }
}

至此,我们完成了微信小程序支付后台java实现的全部功能。

三、示例说明

以下是两个前端调用支付接口的示例。

  1. 前端JS调用代码示例:
function wxPayment(OpenID) {
    $.ajax({
        url: "/unifiedOrder?openid=" + OpenID,
        type: 'POST',
        dataType: 'JSON',
        success: function (res) {
            if (res.errmsg==="ok") {
                var payJson = res;
                wx.chooseWXPay({
                    timestamp: payJson.timeStamp,
                    nonceStr: payJson.nonceStr,
                    package: "prepay_id=" + payJson.prepayId,
                    signType: payJson.signType,
                    paySign: payJson.paySign,
                    success: function (res) {
                        // 支付成功
                        alert("支付成功!");
                    },
                    fail: function (res) {
                        console.log(res);
                    },
                    complete: function (res) {

                    }
                });
            } else {
                console.log(res.errmsg);
            }
        }
    });
}
  1. Android调用支付接口示例:
wxApi = WXAPIFactory.createWXAPI(context, Constant.APP_ID);
wxApi.registerApp(Constant.APP_ID);

public void wxPay(){
    try {
        // 获取服务器生成的预支付订单
        String params = "";//从服务器获取相关参数

        JSONObject json = new JSONObject(params);
        PayReq req = new PayReq();
        req.appId = Constant.APP_ID; // 应用ID
        req.partnerId = json.getString("partnerid"); // 商户号
        req.prepayId = json.getString("prepayid"); // 预支付订单id
        req.packageValue = json.getString("package"); // 格式:Sign=WXPay
        req.nonceStr = json.getString("nonceStr"); // 随机字符串
        req.timeStamp = json.getString("timestamp"); // 时间戳
        req.sign = json.getString("sign"); // 签名

        wxApi.sendReq(req);
    } catch (Exception e) {
        Log.e(TAG, "wxPay: ", e);
    }
}

以上便是本次示例的全部内容。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微信小程序 支付后台java实现实例 - Python技术站

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

相关文章

  • jsp和servlet中实现页面跳转的方式实例总结

    让我来为你详细讲解在JSP和Servlet中实现页面跳转的方式。 1. 前言 通常情况下,当用户访问我们的Web应用程序时,我们需要展示若干个页面给用户。这些页面之间需要相互跳转,让用户能够顺畅地操作网站。在JSP和Servlet中有多种方式实现页面跳转,接下来我将会对这些方式做出总结。 2. response.sendRedirect()方法 respon…

    Java 2023年6月15日
    00
  • Javascript 面向对象特性

    JavaScript面向对象特性 JavaScript是一门支持面向对象编程思想的语言,它提供了很多面向对象特性,如类、对象、继承、封装、多态等。接下来我们将详细讲解JavaScript面向对象特性的完整攻略。 类 在JavaScript中,我们可以使用构造函数来定义一个类,构造函数中包含了初始化对象的属性和方法。例如,下面是一个Person类的定义: fu…

    Java 2023年5月26日
    00
  • 什么是Java性能调优?

    Java性能调优是指通过调整Java程序运行时的各种参数和调用Java API的方式,来使程序的性能达到最优状态。优化程序可以提高Java程序的吞吐量、响应时间和可扩展性。在进行Java性能调优时,需要了解Java虚拟机(JVM)的工作原理、程序的瓶颈所在以及所使用的工具等。 下面是Java性能调优的完整使用攻略: 1. 确定性能指标 在进行性能调优之前,首…

    Java 2023年5月11日
    00
  • Spring使用注解方式处理事务

    当我们在使用Spring框架时,事务管理是一个非常重要的概念。Spring提供了多种方式来处理事务,其中注解方式是一种常用的方式,因为它可以大大简化我们的配置和开发过程。 下面,我会详细讲解如何使用注解方式处理事务,并且提供两个示例。 1. 配置数据源和事务管理器 首先,我们需要配置数据源和事务管理器,这里以MySQL数据库为例。在Spring中配置数据源和…

    Java 2023年5月20日
    00
  • Java编程通过list接口实现数据的增删改查代码示例

    Java编程通过list接口实现数据的增删改查是非常常见的需求。下面我将详细讲解这个完整攻略,其中包括以下几个部分: list接口的简介和操作方式 如何实现数据的增删改查 两个具体的示例说明 1. list接口的简介和操作方式 List接口是Java Collections(集合)框架中的一种,它继承自Collection接口。List中的元素是有序的,可以…

    Java 2023年5月23日
    00
  • Java实现JS中的escape和UNescape代码分享

    实现JS中的escape和unescape,其本质上是Java中的URL编码和解码,Java中提供了相关的API可以实现这一功能。下面是在Java中实现JS中的escape和unescape的完整攻略: 1. URL编码 URL编码,也称百分号编码,是用于在URL中表示非ASCII字符的方法,它的基本原理是将字符转换成它的ASCII码,并在前面加上%。 在J…

    Java 2023年5月23日
    00
  • Java中的==使用方法详解

    Java中的==使用方法详解 在Java中,==是一种用于比较两个变量是否相等的运算符,但是它的使用方法有一些需要注意的地方。 关于==和equals()方法 在Java中,==用于比较两个变量的引用地址是否相等,即它们是否指向同一块内存地址。而equals()方法通常被用来比较两个对象的内容是否相等。 示例1: String str1 = "he…

    Java 2023年5月20日
    00
  • 自定义类加载器的作用是什么?

    自定义类加载器的作用: Java类在运行时是需要被加载的。默认情况下,Java虚拟机会使用以下三种类加载器来加载类: Bootstrap ClassLoader:负责加载Java的核心类,如java.lang.Object等。 Extension ClassLoader:负责加载Java扩展库,如javax.*等。 Application(Class) Cl…

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