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;
}
