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