微信支付(小程序)-java实现与小程序实现

这篇具有很好参考价值的文章主要介绍了微信支付(小程序)-java实现与小程序实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一:java配置

微信支付(小程序)-java配置

二:工具类:获取本地IP与Enum类 与订单支付返回数据

1: 获取本地IP工具类
2:订单 Enum类

package com.io.common.enums;

public enum OrderStatusEnum {
    CANCEL(0,"已取消"),
    NOT_YET_SHIPPED(1,"待支付"),
    PART_OF_THE_SHIPMENT(2,"待发货"),
    WAIT_RECEIVING(3,"待收货"),
    ACHIEVE(4,"已完成"),
    ;
    private Integer key;
    private String desc;

    OrderStatusEnum(Integer key, String desc){
        this.key = key;
        this.desc = desc;
    }

    public Integer getKey() {
        return key;
    }

    public String getDesc() {
        return desc;
    }
}

3:支付方式Enum类

package com.io.common.enums;

public enum PayTypeEnum {

    WX_PAY(1, "微信支付"),

    ;

    private Integer key;
    private String desc;

    PayTypeEnum(Integer key, String desc) {
        this.key = key;
        this.desc = desc;
    }

    public Integer getKey() {
        return key;
    }

    public String getDesc() {
        return desc;
    }

    public static String getDesc(Integer key) {
        for (PayTypeEnum c : PayTypeEnum.values()) {
            if (c.key.equals(key)) {
                return c.getDesc();
            }
        }
        return null;
    }
}

4:微信支付form提交数据

package com.io.order.form;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.math.BigDecimal;

/**
 * @author ts
 * @version 1.0
 * @date 2022/08/05
 */
@Data
public class WxPayForm {

    private Integer orderId;

    @ApiModelProperty("订单号")
    private String orderNo;

    @ApiModelProperty("支付订单号")
    private String orderPayNo;

    @ApiModelProperty("实际支付金额")
    private BigDecimal payAmount;


}

5:微信支付订单返回数据

package com.io.order.vo;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;


@Data
public class AfterPayVO {

    @ApiModelProperty("timeStamp")
    private String timeStamp;

    @ApiModelProperty("nonceStr")
    private String nonceStr;

    @ApiModelProperty("packageValue")
    private String packageValue;

    @ApiModelProperty("signType")
    private String signType;

    @ApiModelProperty("paySign")
    private String paySign;
}

三:service与controller

1:支付 service类

package com.io.order.service;

import com.github.binarywang.wxpay.exception.WxPayException;
import com.io.order.form.WxPayForm;
import com.io.order.vo.AfterPayVO;

import javax.servlet.http.HttpServletResponse;

public interface PayService {

    /**
     * 微信支付
     * @param form 订单数据
     * @param userId // 用户id
     * @param wxId // 微信用户id
     * @return
     * @throws
     */
    AfterPayVO pay(WxPayForm form, String userId,Integer wxId) throws WxPayException;

    /**
     * 微信支付回调
     * @param appid
     * @param xmlData
     * @param response
     * @throws Exception
     */
    void payNotify(String appid, String xmlData, HttpServletResponse response) throws Exception;
}

2:支付 service类实现

package com.io.order.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import com.io.common.enums.OrderStatusEnum;
import com.io.common.enums.PayTypeEnum;
import com.io.entity.WxUserEntity;
import com.io.exception.RRException;
import com.io.order.config.WxPayProperties;
import com.io.order.dao.OrderDao;
import com.io.order.entity.OrderEntity;
import com.io.order.form.WxPayForm;
import com.io.order.service.PayService;
import com.io.order.vo.AfterPayVO;
import com.io.order.vo.RefundVO;
import com.io.service.WxUserService;
import com.io.util.ConvertUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.time.LocalDateTime;
import java.util.Objects;

@Service
@Slf4j
public class PayServiceImpl implements PayService {

    @Autowired
    private WxUserService wxUserService;

    @Value("${he.wx.appid}")
    private String wxAppid;

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public AfterPayVO pay(WxPayForm form, String userId, Integer wxId) throws WxPayException {
        // 查询根据微信id(存微信用户表的id)查询MySQL数据库获取当前用户的微信数据
        WxUserEntity byId = wxUserService.getById(wxId);
        if (Objects.isNull(byId)){
            log.info("微信支付用户wxId:" + wxId);
            throw new RRException("无该微信用户");
        }
        WxPayService wxPayService = this.getWxPayService(wxAppid);

        WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
        orderRequest.setBody("商品付款");
        orderRequest.setOutTradeNo(form.getOrderPayNo());
        orderRequest.setTotalFee(BaseWxPayRequest.yuanToFen(form.getPayAmount().toString()));//元转成分
        orderRequest.setOpenid(byId.getXwOpenId()); // 支付微信用户 微信openId
        orderRequest.setSpbillCreateIp(IpUtils.getAddrIp()); // 本地ip设置
        orderRequest.setSpbillCreateIp("114.55.114.66");
        orderRequest.setNotifyUrl(String.format(properties.getNotifyUrl(), "payNotify", byId.getXwOpenId())); // 支付回调路径与参数拼接设置
        // 支付方式
        orderRequest.setTradeType("JSAPI");

        orderRequest.setAppid(wxAppid);

        Object result = wxPayService.createOrder(orderRequest);
        AfterPayVO afterPayVO = ConvertUtils.sourceToTarget(result, AfterPayVO.class);
        return afterPayVO;
    }

    @Override
    public void payNotify(String appid, String xmlData, HttpServletResponse response) throws Exception {

        WxPayService wxPayService = this.getWxPayService(appid);
        final WxPayOrderNotifyResult notifyResult = wxPayService.parseOrderNotifyResult(xmlData);
        log.info("支付订单号:" + notifyResult.getOutTradeNo());

        // 小程序支付成功后回调这个接口 后的订单业务逻辑 (请根据项目来编写)
        LambdaQueryWrapper<OrderEntity> lambdaQueryWrapper =new LambdaQueryWrapper<OrderEntity>();
        lambdaQueryWrapper.eq(OrderEntity::getOrderPayNo,notifyResult.getOutTradeNo());
        OrderEntity orderEntity = orderDao.selectOne(lambdaQueryWrapper);
        //订单状态
        if (OrderStatusEnum.NOT_YET_SHIPPED.getKey().equals(orderEntity.getOrderStatus())){
            orderEntity.setOrderStatus(OrderStatusEnum.PART_OF_THE_SHIPMENT.getKey());
            orderEntity.setPaymentType(PayTypeEnum.WX_PAY.getKey());
            orderEntity.setPaymentTime(LocalDateTime.now());
            orderDao.updateById(orderEntity);
        }

        //回复微信防止重复回调
        StringBuilder resXml = new StringBuilder();
        resXml.append("<xml>");
        resXml.append("<return_code><![CDATA[SUCCESS]]></return_code>");
        resXml.append("<return_msg><![CDATA[OK]]></return_msg>");
        resXml.append("</xml>");
        BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
        out.write(resXml.toString().getBytes());
        out.flush();
        out.close();
    }
    
    /** 获取商户号配置并生成 WxPayService 
     * getWxPayService
     * @param appid
     * @return
     */
    private WxPayService getWxPayService(String appid){
        WxPayConfig payConfig = new WxPayConfig();
        payConfig.setAppId(appid);
        payConfig.setMchId(StringUtils.trimToNull(this.properties.getMchId()));
        payConfig.setMchKey(StringUtils.trimToNull(this.properties.getMchKey()));
        payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getKeyPath()));
        // 可以指定是否使用沙箱环境
        payConfig.setUseSandboxEnv(false);

        WxPayService wxPayService = new WxPayServiceImpl();
        wxPayService.setConfig(payConfig);
        return wxPayService;
    }
}

3: Controller类

package com.io.order.controller;

import com.io.base.BaseController;
import com.io.order.service.PayService;
import com.io.util.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;

@RestController
@RequestMapping("/pay")
@Api(tags = "支付接口")
@Slf4j
public class PayController{

    @Autowired
    private PayService payService;

    @PostMapping("/payNotify/{appid}")
    @ApiOperation("支付回调")
    public R payNotify(@PathVariable String appid, @RequestBody String xmlData, HttpServletResponse response) throws Exception {
        payService.payNotify(appid, xmlData, response);
        return R.ok();
    }

三:小程序调用 支付接口

官方文档:wx.requestPayment

注:res.data.purchase  是先走下单逻辑(去后台下单并且调用了 支付接口)
返回参数: AfterPayVO;
小程序前端所用到的参数是 订单支付返回的参数
wx.requestPayment({
  timeStamp: res.data.purchase.timeStamp,
  nonceStr: res.data.purchase.nonceStr,
  package: res.data.purchase.packageValue,
  signType: 'MD5',
  paySign: res.data.purchase.paySign,
  success (res) {
    支付成功
  },
  fail (res) {
    支付取消或失败
  }
})

2: 开发工具中测试支付接口 所展示的样子

3:正式环境样式

微信小程序支付功能怎么实现java,小程序,java,微信,小程序文章来源地址https://www.toymoban.com/news/detail-632910.html

到了这里,关于微信支付(小程序)-java实现与小程序实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot实现微信小程序V3微信支付功能

    appId:小程序appid appSecret:小程序的secret mchId:商户号 keyPath:商户私钥路径(apiclient_key.pem) certPath:证书路径(apiclient_cert.pem) platFormPath:平台证书(cert.pem) 注 : 需要通过写程序生成平台证书(见v3Get()方法) apiKey3:apiv3密钥 serialnumber:商户证书序列号 notifyUrl:回调地

    2024年02月12日
    浏览(45)
  • 【uni-app微信小程序】实现支付功能

    实现微信支付功能需要在小程序后台配置支付相关信息,并且在前端代码中调用微信支付API进行支付操作。好的, uni-app微信小程序实现支付功能整体流程 大致如下: 注册微信公众平台,并完成开发者资质认证; 在微信商户平台注册商户账号,并完成商户资质认证; 在商户

    2024年02月13日
    浏览(77)
  • 全网最详细实现微信小程序支付功能【前端部分】

    用户点击立即购买后进入确认订单页面,在此页面可选择商品数量,是否使用优惠券,以及一些简单的个人信息填写,点击支付输入密码则支付成功,如果点击支付后没有付款关闭了页面会跳转到待支付页面并开始倒计时(待支付页面显示该商品适用的店铺信息及个人信息订

    2024年02月11日
    浏览(43)
  • 【Node.js】实现微信小程序在线支付功能

    实战项目名称:微信小程序实现在线支付功能 - 文章结尾附上微信小程序码,扫码登录后即可体验!! 注意:对接 微信支付 功能,必须得先有微信支付的 商户号 ,不然你是测试不了微信支付功能的。 原因: 微信官网不提供微信支付的测试账号 微信支付一切都以商户号为

    2024年02月09日
    浏览(53)
  • 使用云开发环境的云函数实现微信小程序的支付功能

    背景: 近期在开发一个商城类的微信小程序,因为本人只会使用 C 语言对 nodejs 环境不熟悉,因此在开发微信小程序时选用容易上手的云开发环境开发微信小程序。我想选用云开发环境的小伙伴和我的想法一致,对微信小程序开发相关知识了解很少。我的小程序的主体是个体

    2024年04月23日
    浏览(37)
  • Java实现微信小程序V3支付

    2024年02月12日
    浏览(47)
  • 【微信小程序】Java实现微信支付(小程序支付JSAPI-V3)java-sdk工具包

          对于一个没有写过支付的小白,打开微信支付官方文档时彻底懵逼 ,因为 微信支付文档太过详细, 导致我无从下手,所以写此文章,帮助第一次写支付的小伙伴梳理一下。 一、流程分为三个接口:(这是前言,先看一遍,保持印象,方便理解代码) 1、第一个接口:

    2024年02月03日
    浏览(50)
  • 微信小程序基于java实现v2支付,提现,退款

    v2微信官方文档 封装支付请求实体 controller接口暴露层 payFoodOrder 支付接口实现类 获取请求ip wxform.setNotifyUrl(WechatUtil.getPayNotifyUrl() + WXPAY_NOTIFY_URL_FOOD_ORDER); 这个回调地址是你自己代码里面定义的回调接口,例如你定义的controller回调接口url是 feedback/wx/notifurl , 即是 wxform.setNoti

    2024年02月09日
    浏览(44)
  • Java实现微信小程序V3支付 (完整demo)

    2024年02月07日
    浏览(32)
  • SpringBoot对接微信小程序支付功能开发(二,支付回调功能)

    接着上一篇: SpringBoot对接微信小程序支付功能开发(一,下单功能) 在上一篇下单功能中我们有传支付结果回调地址。 下面是回调接口实现 根据官网给的参数进行业务处理 这就完成了,微信支付回调你的地址,并且把支付的信息传进来,剩下就要根据自己业务进行操作。

    2024年02月11日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包