微信支付Native支付

Native支付

微信支付官方文档https://pay.weixin.qq.com/wiki/doc/api/index.html

微信支付首先需要两个账号
微信公众平台:https://mp.weixin.qq.com/
微信商户平台:https://pay.weixin.qq.com/index.php/core/home/login

商户号可以有很多都对应一个公众号
两者需关联
不然会出现商户ID和APPID不匹配

微信支付目前有七种,本文主要介绍Native支付相关流程
在这里插入图片描述
微信支付配置文件
证书和秘钥每个商户都要使用不同的
如果写错或用错,当你在下单验证时会一直通知签名失败
在这里插入图片描述
准备好配置文件后引入微信的JAVA工具包

<dependency>
  <groupId>com.github.wxpay</groupId>
  <artifactId>wxpay-sdk</artifactId>
  <version>0.0.3</version>
</dependency>

微信的配置类

import com.github.wxpay.sdk.WXPayConfig;
import org.springframework.core.io.ClassPathResource;

import java.io.InputStream;

public class IWxPayConfig implements WXPayConfig {

    private String app_id = "可以从公众平台或商户平台的开发配置中找到";

    private String key = "商户平台的API秘钥";

    private String mch_id = "商户平台的商户号";

    private int conn_timeout = 8000;

    private int read_timeout = 10000;

    private InputStream inputStream;

    public IWxPayConfig() throws Exception {
    //加载对应商户平台的安全证书
        ClassPathResource classPathResource = new ClassPathResource("wxpay/apiclient_cert.p12");
        this.inputStream = classPathResource.getInputStream();
        inputStream.close();
    }

    @Override
    public String getAppID() {
        return this.app_id;
    }

    @Override
    public String getMchID() {
        return this.mch_id;
    }

    @Override
    public String getKey() {
        return this.key;
    }

    @Override
    public InputStream getCertStream() {
        return this.inputStream;
    }

    @Override
    public int getHttpConnectTimeoutMs() {
        return this.conn_timeout;
    }

    @Override
    public int getHttpReadTimeoutMs() {
        return this.read_timeout;
    }
}

native支付方法

使用的是native微信支付模式二
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5

/**
     * 功能描述:native支付
     */
 public static Map<String, String> nativeApiPay() {
        try {
            IWxPayConfig iWxPayConfig = new IWxPayConfig();
            // 注入自己实现的微信配置类, 创建WXPay核心类
            WXPay wxpay = new WXPay(iWxPayConfig);
            // 封装下单参数
            Map<String, String> data = new HashMap<>();
            data.put("appid", iWxPayConfig.getAppID());
            data.put("mch_id", iWxPayConfig.getMchID()); // 商户号
            data.put("nonce_str", WXPayUtil.generateNonceStr());// 随机字符串
            data.put("body", "网上商城"); // 订单
            data.put("out_trade_no", IDUtils.getUUId()); // 订单唯一编号, 不允许重复
            data.put("total_fee", "1"); // 订单金额 单位分
            data.put("spbill_create_ip", "用户真实IP"); // 终端ip
            data.put("notify_url", "回调的接口,需要在商户平台中设置"); // 订单结果通知, 微信主动回调此接口
            data.put("trade_type", "NATIVE"); // 固定填写
            data.put("product_id", "1");
            data.put("receipt", "Y");
            data.put("fee_type", "CNY"); // 默认人民币
            // 签名数据
            System.out.println("data:" + JsonUtils.objectToJson(data));
            String sign = WXPayUtil.generateSignature(data, iWxPayConfig.getKey(), WXPayConstants.SignType.MD5);
            //验证签名
            data.put("sign", sign);
            /** wxPay.unifiedOrder 这个方法中调用微信统一下单接口 */
            Map<String, String> msg = wxpay.unifiedOrder(data);
            logger.info("微信支付下单结果" + msg);
            Map<String, String> wxPayMap = new HashMap<>();
            wxPayMap.put("return_code", msg.get("return_code"));
            wxPayMap.put("return_msg", msg.get("return_msg"));
            //返回给前端的支付链接,由前端转换成二维码供用户扫描接口
            wxPayMap.put("code_url", msg.get("code_url"));
            return wxPayMap;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

验签
微信支付签名是要加密你需要提交的所有信息
然后再吧签名+其余信息一起提交下单

验签失败
如果显示验签失败大概率是密钥和证书的问题

如有其余疑问请在评论区留言,感谢您的阅读

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值