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

相关文章

  • 图文教程教你IDEA中的Spring环境搭建+简单入门

    图文教程:IDEA中的Spring环境搭建+简单入门 本文基于集成开发环境IntelliJ IDEA,为初学者讲解了如何搭建Spring环境和进行简单入门操作。下面是详细的步骤: 1. 安装IDEA 首先需要下载并安装IntelliJ IDEA,官方网站为:https://www.jetbrains.com/idea/download/。选择对应操作系统版本…

    Java 2023年5月19日
    00
  • 编码实现从无序链表中移除重复项(C和JAVA实例)

    针对“编码实现从无序链表中移除重复项(C和JAVA实例)”,我来为你做一个详细的讲解攻略。 概述 无序链表中的元素可能会出现重复,我们需要从链表中移除这些重复项。本攻略将提供C语言和Java语言的实现示例,以帮助你更好理解链表去重的过程。 解题思路 链表去重的简单解法是使用哈希表。我们遍历链表中的每个节点,使用哈希表来存储这些节点包含的值。如果遇到一个节点其…

    Java 2023年5月20日
    00
  • 小程序websocket心跳库(websocket-heartbeat-miniprogram)

    小程序websocket心跳库(websocket-heartbeat-miniprogram)是一个专为微信小程序开发的websocket心跳保活库。本库基于wx.socket组件进行二次封装,使得小程序能够稳定地通过websocket进行双向实时通信。本库提供了websocket的连接建立、websocket的发送数据、websocket的心跳保活、we…

    Java 2023年5月23日
    00
  • 详解Java Streams 中的异常处理

    详解Java Streams 中的异常处理 在 Java 8 中引入了 java.util.stream.Stream 对象,它为我们提供了一种基于lambda表达式的函数式编程方式,方便我们对集合、数组等数据进行快速处理。但是在使用 Stream 进行数据处理的过程中,我们也需要考虑一些异常问题,本文将详细讲解 Java Streams 中的异常处理方案。…

    Java 2023年5月27日
    00
  • Java 泛型详解(超详细的java泛型方法解析)

    Java泛型详解 什么是泛型? 泛型主要体现在类和方法中,用于实现在编译时期进行类型检查和类型推断的功能,从而避免了在运行时出现类型转换的错误。 泛型类 泛型类是指在类的定义中使用了泛型,即类中的属性、方法等都可以使用泛型。泛型类的语法格式如下: class ClassName<T1, T2, …> { //属性的类型也可以使用泛型 T1 a…

    Java 2023年5月23日
    00
  • java中URLEncoder.encode与URLDecoder.decode处理url特殊参数的方法

    下面是 Java 中 URLEncode 和 URLDecode 处理 URL 特殊参数的完整攻略。 URLEncode 和 URLDecode 概述 在 URL 中,有一些字符是有特殊意义的,例如问号、等号、百分号等,如果要在 URL 中传递这些特殊字符,需要进行编码和解码操作,否则会导致 URL 出现错误。 URLEncode 操作就是将传入的字符串进行…

    Java 2023年5月20日
    00
  • 一文详解Spring Security的基本用法

    一文详解Spring Security的基本用法 Spring Security是Spring框架中用于安全管理的子框架,它提供了一系列机制来保护应用程序的资源不被未经授权的用户访问,是Web应用程序开发中不可或缺的一部分。本文将详细讲解Spring Security的基本用法,包括如何添加依赖、配置安全和认证、以及如何使用注解来保护资源。 添加Spring…

    Java 2023年5月20日
    00
  • 使用jdk1.8实现将list根据指定的值去分组的操作

    这里是使用JDK1.8实现将List根据指定的值进行分组的完整攻略。 1. 需求分析 我们要实现将List根据指定的值进行分组,要求在分组结果中,具有相同指定值的元素会被分到同一组中。例如,假设我们有如下的Student类: public class Student { private int id; private String name; private…

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