Java实现微信支付(微信公众号JSAPI支付)

Java实现微信支付(微信公众号JSAPI支付)

第一步 开发环境准备

不过,个人用户是无法成为商家的,只有以下几种用户类型才可以成为商家。 成为商家之后,需要完成证书申请、秘钥配置、产品申请等操作,具体如下。

1.1 申请证书与秘钥的配置

1.2 申请产品

1.3 开发配置信息填写

1.4 APPID账号管理

    商户号 AppID API证书(3个文件) APIv2秘钥 APIv3秘钥 回调链接

第二步 项目创建与依赖导入

2.1 创建SpringBoot项目

创建SpringBoot项目的教程太多太多了…比如:,所以这里不再赘述。 项目结构如下图所示。

2.2 导入依赖

其中最新版本可前往Maven官方仓库查看。

代码部分

1、 获取openid

补上刚刚用的实体类AccessToken

@Data
public class AccessToken {
          
   
    private String accessToken;
    private String expiresIn;
    private String refreshToken;
    private String openid;
    private String scope;
}

2、创建配置实体类

注意:为了减少代码篇幅,此代码引入了lombok。如果没有使用lombok,请自行生成Get和Set方法。

3、实现支付服务类

以下代码实现了基本的配置和支付、退款。查询功能,有详细的注解。 另外注意:以下代码中使用了Hutool组件的Id生成工具(用于生成订单号),请在pom文件中自行添加hutool的依赖

3.1 服务类的补充说明

4、实现控制类

代码中有详细注释,不过多解释

5、调起支付

看看前台都需接收哪些值吧 Java代码展示:

补充上面代码用到的MyPrivateKey工具类

import org.springframework.stereotype.Repository;

import java.io.IOException;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;

@Repository
public class MyPrivatekey {
          
   
    /**
     * 获取私钥。
     *
     * @param filename 私钥文件路径  (required)
     * @return 私钥对象
     */
    public static PrivateKey getPrivateKey(String filename) throws IOException {
          
   

        String content = new String(Files.readAllBytes(Paths.get(filename)), "utf-8");
        try {
          
   
            String privateKey = filename.replace("-----BEGIN PRIVATE KEY-----", "")
                    .replace("-----END PRIVATE KEY-----", "")
                    .replaceAll("\s+", "");

            KeyFactory kf = KeyFactory.getInstance("RSA");
            return kf.generatePrivate(
                    new PKCS8EncodedKeySpec(Base64.getMimeDecoder().decode(privateKey)));
        } catch (NoSuchAlgorithmException e) {
          
   
            throw new RuntimeException("当前Java环境不支持RSA", e);
        } catch (InvalidKeySpecException e) {
          
   
            throw new RuntimeException("无效的密钥格式");
        }
    }
}

Service层代码:

@Override
public String rsaPaySign(String prepayId) {
          
   
   String appId = "XXXXXXX";
   try {
          
   
       String getToken = createSign.getToken(appId, prepayId);
       return getToken;
   } catch (IOException e) {
          
   
       e.printStackTrace();
   } catch (SignatureException e) {
          
   
       e.printStackTrace();
   } catch (NoSuchAlgorithmException e) {
          
   
       e.printStackTrace();
   } catch (InvalidKeyException e) {
          
   
       e.printStackTrace();
   }
   return "签名错误";
}

前端控制器Controller层代码:

/**
     * 调起支付对sign加密
     * @param prepayId
     * @return
     */
    @GetMapping("rsaPaySign")
    public String rsaPaySign(@RequestParam("prepayId")String prepayId){
          
   
        System.out.println("prepayId:"+prepayId);
        String rsaPaySign = weChatPayService.rsaPaySign(prepayId);
        return rsaPaySign;
    }

6、前端调起支付部分代码(Vue)

经验分享 程序员 微信小程序 职场和发展