微信小程序 支付后台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日

相关文章

  • java struts2学习笔记之线程安全

    Java Struts2 学习笔记之线程安全攻略 什么是线程安全 在Java开发中,线程安全主要是指程序在多线程环境下能够正确、稳定地执行,并达到预期结果。 具体来说,在多线程环境下,如果有多个线程同时对共享资源进行访问和修改,那么就需要保证这些线程之间的并发执行是正确、稳定、安全的。 如果没有进行线程安全处理的话,可能会出现一些潜在的问题,例如: 竞态条件…

    Java 2023年5月20日
    00
  • SpringBoot打印详细启动异常信息

    下面是详细讲解 SpringBoot 打印详细启动异常信息的攻略: 打印启动异常信息的原因 在启动 SpringBoot 应用的过程中,如果出现异常错误,应用程序就不会启动,而是会抛出异常。这时候我们需要查看详细的错误信息,以便知道具体出现了什么问题。 解决方法 方法一:在配置文件中进行配置 在 SpringBoot 的配置文件 application.pr…

    Java 2023年5月27日
    00
  • Java Apache Commons报错“TransformerFactoryConfigurationError”的原因与解决方法

    “TransformerException”是Java的ApacheCommons类库中的一个异常,通常由以下原因之一引起: XML格式错误:如果XML格式不正确,则可能会出现此异常。例如,可能会缺少必需的元素或属性。 XSLT格式错误:如果XSLT格式不正确,则可能会出现此异常。例如,可能会使用错误的XSLT模板或模板配置错误。 以下是两个实例: 例1 如…

    Java 2023年5月5日
    00
  • 用java在web环境下上传和下载文件的技巧

    为在web环境下实现Java文件上传和下载,我们可以使用Servlet API或Spring框架。下面将为您提供示例代码,并简要讲解如何实现。 文件上传 使用Servlet API 在Servlet API中,我们可以使用HttpServletRequest和javax.servlet.http.Part对象来处理文件上传。首先,需要在HTML表单中添加en…

    Java 2023年5月19日
    00
  • 详解MyBatis的getMapper()接口、resultMap标签、Alias别名、 尽量提取sql列、动态操作

    下面就针对所提到的 MyBatis 的几个关键点展开讲解。 getMapper() 接口 getMapper() 接口是 MyBatis 通过动态代理将 Mapper 接口和 XML 配置文件绑定在一起。这样每次调用的时候就可以直接使用对象调用 Mapper 中的方法,并且 MyBatis 会自动帮我们调用 SQL 语句。下面是一个示例: public in…

    Java 2023年5月20日
    00
  • Tomcat配置JMX远程连接的详细操作

    下面将详细讲解Tomcat配置JMX远程连接的操作步骤。 一、在Java环境变量中配置JMX参数 在Java环境变量中配置以下参数,用于开启JMX远程服务: -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.1.1 -Dcom.sun.management.jmxremote.…

    Java 2023年5月19日
    00
  • java多线程消息队列的实现代码

    为了实现Java多线程消息队列的功能,可以通过以下步骤完成: 第一步:定义消息类 定义一个消息类,可以包含消息ID、消息内容、消息时间等属性。 public class Message { private int messageId; private String content; private Date createTime; public Messag…

    Java 2023年5月19日
    00
  • JavaScript处理解析JSON数据过程详解

    下面是“JavaScript处理解析JSON数据过程详解”的完整攻略。 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输。它是纯文本的,可读性较好,易于编写和解析,同时支持多种编程语言。 JSON由于其简洁性、标准化、易读性和跨平台性等优点越来越受到广泛的关注和应用。并且许多现代…

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