【微信支付】springboot-java接入微信支付-JSAPI支付/查单/退款/发送红包(一)---JSAPI支付

一、准备工作

1、注册微信公众号并认证企业
进入官网:https://mp.weixin.qq.com/

前往认证在这里插入图片描述认证成功后,牢记AppID(开发者ID)和AppSecret(开发者密码)
在这里插入图片描述

2、注册微信支付商户号并认证

进入官网:https://pay.weixin.qq.com/
在这里插入图片描述

在这里插入图片描述注册认证成功后,进入产品中心,修改开发配置,添加支付配置中的JSAPI支付授权目录地址;配置完成后,只可以在配置好的地址下才能调用微信地址(无法输入ip地址)
在这里插入图片描述
添加成功后,进入AppID账号管理,绑定已经创建并且认证好的微信公众号
在这里插入图片描述
3、准备微信支付密钥及证书等配置
在这里插入图片描述具体操作请查看官方给出的指引,很简单

二、创建配置文件

首先在pom.xml中引入微信支付工具类

<dependency>
  <groupId>com.github.wechatpay-apiv3</groupId>
  <artifactId>wechatpay-java</artifactId>
  <version>0.2.12</version>
</dependency>

在SpringBoot项目中创建WxPayConfig.java文件

package ***********************;

import com.wechat.pay.contrib.apache.httpclient.util.PemUtil;
import lombok.Data;
import org.springframework.context.annotation.Configuration;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.security.PrivateKey;
import java.security.Signature;
import java.util.Base64;

@Configuration
@Data
public class WxPayConfig {
    //商户号
    private String mchId = "*********";
    //商户API证书序列号
    private String mchSerialNo = "******************************";
    //商户私钥文件路径-如果是本地验证,请输入绝对路径
    public String privateKeyPath = "**************";
    //APIv3密钥
    private String apiV3Key = "*******************************";
    //APPID
    private String appid = "wx**************";
    //APIV2密钥
    public String apiV2Key = "***********************";

		//读取证书pem文件获取私钥
    public PrivateKey getPrivateKey() {
        try {
            return PemUtil.loadPrivateKey(new FileInputStream(privateKeyPath));
        } catch (FileNotFoundException e) {
            throw new RuntimeException("私钥不存在", e);
        }
    }

		//下面三个是微信商户给出的获取支付签名的方法
		//https://pay.weixin.qq.com/docs/merchant/sdk-tools/quickstart-java.html
    public String getSign(String appId, String timestamp, String nonceStr, String pack) throws Exception{
        String message = buildMessage(appId, timestamp, nonceStr, pack);
        String paySign= sign(message.getBytes("utf-8"));
        return paySign;
    }


		
    private String buildMessage(String appId, String timestamp, String nonceStr, String pack) {
        return appId + "\n"
                + timestamp + "\n"
                + nonceStr + "\n"
                + pack + "\n";
    }
    private String sign(byte[] message) throws Exception{
        Signature sign = Signature.getInstance("SHA256withRSA");
        //这里需要一个PrivateKey类型的参数,就是商户的私钥。
        //获取商户私钥
        PrivateKey privateKey = getPrivateKey();
        sign.initSign(privateKey);
        sign.update(message);
        return Base64.getEncoder().encodeToString(sign.sign());
    }
}

实体类Entity.java文件

import lombok.Data;

@Data
public class Entity {
    private Integer id;
    private String order_no;
    private String price;
    private String card_name;
    private String openid;
}

创建QuickStart.java文件,开始调用微信JSAPI支付

package *****************************;

import com.example.vue2_servers.entity.Entity;
import com.github.wxpay.sdk.WXPayUtil;
import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.service.payments.jsapi.JsapiService;
import com.wechat.pay.java.service.payments.jsapi.model.Amount;
import com.wechat.pay.java.service.payments.jsapi.model.Payer;
import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest;
import com.wechat.pay.java.service.payments.jsapi.model.PrepayResponse;
import lombok.extern.slf4j.Slf4j;
import okhttp3.HttpUrl;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.methods.HttpPost;
import org.jose4j.json.internal.json_simple.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.security.PrivateKey;
import java.security.Signature;
import java.util.*;
@Slf4j
@RestController
@Controller
public class QuickStart {

	// 注入创建的WxPayConfig.java读取配置信息
    @Resource
    private WxPayConfig wxPayConfig;


    @PostMapping("/jsapi_pay")
    public Map<String, Object> jsapi_pay(@RequestBody Entity entity) {
        // 使用自动更新平台证书的RSA配置
        // 一个商户号只能初始化一个配置,否则会因为重复的下载任务报错
        Config config =
                new RSAAutoCertificateConfig.Builder()
                        .merchantId(wxPayConfig.getMchId())
                        .privateKeyFromPath(wxPayConfig.getPrivateKeyPath())
                        .merchantSerialNumber(wxPayConfig.getMchSerialNo())
                        .apiV3Key(wxPayConfig.getApiV3Key())
                        .build();
        // 构建service
        JsapiService service = new JsapiService.Builder().config(config).build();

        // request.setXxx(val)设置所需参数,具体参数可见Request定义
        com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest request = new PrepayRequest();
        com.wechat.pay.java.service.payments.jsapi.model.Amount amount = new Amount();
		//amount.setTotal(1); //金额,单位:分
        amount.setTotal((int) (Double.parseDouble(entity.getPrice()) * 100)); //金额,单位:分,输入的是string类型金额,在这里转化为分并且转int类型
        request.setAmount(amount);
        
        request.setAppid(wxPayConfig.getAppid());
        Payer payer = new Payer();
        payer.setOpenid(entity.getOpenid());
        
        request.setPayer(payer);
        request.setMchid(wxPayConfig.getMchId());
        request.setDescription(entity.getCard_name());
        request.setNotifyUrl("https://url"); //通知地址,只能是https: 暂时随便填
        request.setOutTradeNo(entity.getOrder_no());
        // 调用下单方法,得到应答
        PrepayResponse response = service.prepay(request);


        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);
        map.put("prepay_id", response.getPrepayId()); //微信支付接口返回的是prepay_id,为后续接口做准备
        return map;
    }
}
  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
微信JSApi支付是指在微信公众号或小程序内使用JSAPI调起微信支付功能,实现用户在微信内完成付款的一种方式。以下是常见的问题及解决方法: 1. 支付时提示“商户订单号重复” 解决方法:修改商户订单号,确保每笔订单的商户订单号唯一。 2. 支付时提示“支付金额与订单金额不一致” 解决方法:检查订单金额和实际支付金额是否相同,确保订单金额与实际支付金额一致。 3. 支付时提示“支付失败,请稍后再试” 解决方法:检查支付参数是否正确,确保支付参数的完整性和准确性。 4. 支付时提示“当前用户未授权,请先授权登录” 解决方法:用户需要先授权登录,获取用户信息后才能进行支付操作。 5. 支付时提示“当前用户未关注公众号” 解决方法:用户需要先关注公众号,才能进行支付操作。 6. 支付时提示“商户号与appid不匹配” 解决方法:检查商户号和appid是否对应,确保商户号和appid的匹配性。 7. 支付时提示“订单已关闭” 解决方法:订单可能已经被关闭或者已经完成支付,需要重新下单。 8. 支付时提示“系统繁忙,请稍后再试” 解决方法:服务器可能正在维护或者出现故障,需要等待一段时间后再尝试支付。 以上是微信JSApi支付常见问题及解决方法,如果以上方法无法解决问题,可以联系微信支付客服进行咨询。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值