微信支付之服务商模式App下单

准备各种参数密钥

	// app的Id 微信开放平台得到的
 	public static String appId = "wx123456789";
	// 服务商的商户号 申请成为服务商登录后账号中心能看到
    public static String merchantId = "123456789";
	// 服务商的私钥,不知道怎么获得[点我](https://kf.qq.com/faq/161222NneAJf161222U7fARv.html)
    public static String privateKeyPath = "src\\main\\resources\\wx\\apiclient_key.pem";
    // 服务商请求接口的key 账户中心 -> api安全 -> 设置APIv3密钥 
    public static String apiV3key = "asbaKatajelkYwq9Zsuji5Lc48Glpert";
	// 微信支付平台的密钥
	[首先下载]
	CertificateDownloader.jar  [点我点我](https://gitcode.net/mirrors/wechatpay-apiv3/CertificateDownloader)
	[运行命令] 
	java -jar E:\CertificateDownloader.jar -k 替换成上面的apiV3key不需要双引号 -m 替换成上面的merchantId -f 替换成上面的privateKeyPath -s 替换成下面的privateKeyPath -o 替换成你想保存证书的目录
	[例子]
	java -jar E:\CertificateDownloader.jar -k asbaKatajelkYwq9Zsuji5Lc48Glpert -m 123456789 -f E:\apiclient_key.pem -s 2123123123C827366B4FFC780454A0CA598C9 -o E:\data
	运行上面的命令后得到的证书位置
    public static String wechatpayPath = "src\\main\\resources\\wx\\wechatpay_123.pem";
	// 服务商的序列号 账户中心 -> api安全 -> 申请API证书
    public static String merchantSerialNumber = "2123123123C827366B4FFC780454A0CA598C9";
	

微信初始化加载

Config config =
            new RSAAutoCertificateConfig.Builder()
                    .merchantId(merchantId)
                    .privateKey(getStrKey())
                    .merchantSerialNumber(merchantSerialNumber)
                    .apiV3Key(apiV3key)
                    .build();

// 获取resources下的wx/apiclient_key.pem 密钥 为了打包后也能获取到,之前的方式打包获取不到。
public String getStrKey() throws IOException {
        ClassPathResource resource = new ClassPathResource("/wx/apiclient_key.pem");
        return StreamUtils.copyToString(resource.getInputStream(), Charset.defaultCharset());
    }

App下单

 	// 请求下单
 	public PrepayWithRequestPaymentResponse prepayWithRequestPayment(WxPlaceOrderDTO dto) {
  
        com.wechat.pay.java.service.partnerpayments.app.model.PrepayRequest request = new PrepayRequest();
        // 组装发起的参数  以下官方文档中有说明 [官方文档说明](https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_2_1.shtml)
        request.setSpAppid(appId);
        request.setSpMchid(dto.getSpMchId());
        request.setSubMchid(dto.getSubMchId());
        request.setDescription(dto.getDescription());
        request.setOutTradeNo(dto.getOutTradeNo());
        request.setAttach(dto.getAttach());
        // 回调地址,POST请求,不可带任何参数
        request.setNotifyUrl("https://xxxxx/notify");
        com.wechat.pay.java.service.partnerpayments.app.model.Amount amount = new Amount();
        // 价格
        amount.setTotal(1);
        amount.setCurrency("CNY");
        request.setAmount(amount);
        return service.prepayWithRequestPayment(request, appId);
    }

 	// 支付成功后的回调
  	@PostMapping(value = "/notify")
    public String wxPayNotify(HttpServletRequest request) throws IOException {

		// 平台证书序列号
        String serialNo = request.getHeader("Wechatpay-Serial");
        // 签名时间戳
        String timestamp = request.getHeader("Wechatpay-Timestamp");
        // 签名随机字符串
        String nonce = request.getHeader("Wechatpay-Nonce");
        // 验签值
        String signature = request.getHeader("Wechatpay-Signature");
		// 返回的body
 		String body = readData(request);
        com.wechat.pay.java.core.notification.RequestParam requestParam = new com.wechat.pay.java.core.notification.RequestParam.Builder()
                .serialNumber(serialNo)
                .nonce(nonce)
                .signature(signature)
                .timestamp(timestamp)
                .body(body)
                .build();
        NotificationConfig configs = (NotificationConfig) config;
        // 初始化 NotificationParser
        NotificationParser parser = new NotificationParser(configs);
        // 验签、解密并转换成 Transaction
        Transaction transaction = parser.parse(requestParam, Transaction.class);
        // 获取微信支付自定义表的id 这个字段下单的时候传的,啥都可以,我把业务id传过来,方便修改业务
        Long id = Long.valueOf(transaction.getAttach());
        
        // 判断是否支付成功
        if (!transaction.getTradeState().name().equals("SUCCESS")){
           
        }
     
        return "true"
    }


	/**
     * 将通知参数转化为字符串
     * @param request
     * @return
     */
    public static String readData(HttpServletRequest request) {
        BufferedReader br = null;
        try {
            StringBuilder result = new StringBuilder();
            br = request.getReader();
            for (String line; (line = br.readLine()) != null; ) {
                if (result.length() > 0) {
                    result.append("\n");
                }
                result.append(line);
            }
            return result.toString();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值