Java后端对接微信支付(微信小程序、APP、PC端扫码)非常全,包含查单、退款

首先我们要明确目标,我们点击 微信支付官网 ,我们主要聚焦于这三种支付方式,其中JSPAI与APP主要与uniapp开发微信小程序与APP对接,而NATIVE主要与网页端扫码支付对接

1.三种支付统一准备工作

建议导入这个jar,里面一些提供map和xml互转以及生成签名的函数,使用非常方便。

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

ps: 下面代码涉及到的 WXPayUtil 下面的函数都是这个工具包里来的,所以不要再问这个函数代码在哪

商户号与支付结果通知 回调地址

回调url配置途径:

微信商户平台(pay.weixin.qq.com)-->产品中心-->开发配置-->支付配置

既然涉及到维信小程序和app,那么它们的 app_id 是必须的

统一下单、查单、退款的API地址,去官方文档找即可,我这里直接写好了

/**
 * 统一下单接口
 */
public static final String UNIFIED_ORDER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";

/**
 * 查询订单接口
 */
public static final String ORDER_QUERY_URL = "https://api.mch.weixin.qq.com/pay/orderquery";

 /**
  * 订单退款接口
  */
public static final String ORDER_REFUND_URL = "https://api.mch.weixin.qq.com/secapi/pay/refund";

API密钥

用于签名算法

获取途径

微信商户平台(pay.weixin.qq.com)-->账户中心-->账户设置-->API安全-->设置API密钥

2.JSAPI统一下单

这种支付的使用场景,我们这里是 对接uniapp开发的微信小程序

我们仔细阅读文档并提取信息,其实访问接口的很多参数都不是必填的,我们尽量去关注 必填参数

归纳如下:

appid 微信小程序app_id
mch_id 商户号
nonce_str 随机字符串,可以调用 WXPayUtil下 generateNonceStr方法生成
sign

可以调用 WXPayUtil下 generateSignature方法生成,这个方法需要用到准备工作中的商户API密钥(APP_KEY)来加密。

body 商品描述,建议软件名字+产品操作,例如天天爱消除-游戏充值
out_trade_no 我们自己生成的订单号,保证同一商号下唯一即可
total_fee 金额,注意单位是分
spbill_create_ip 用户客户端ip
notify_url 支付结果通知回调地址
trade_type 交易类型,我们这里填JSAPI
openid 因为是JSAPI方式,所以必传,openid其实很好获取,参考地址 如何获取openid

但是下完单之后,怎么样才能让前端调用微信支付呢?这里需要查看uniapp 官方文档 微信小程序支付

我们发现其实主要是拿到预支付id prepay_id 以及 签名 。

代码实现:

public Map<String, String> unifiedOrderByJsp(Order order, String clientIp) throws Exception {
        long begin = System.currentTimeMillis();
        //使用map封装微信支付需要的固定参数
        Map<String, String> m = new HashMap<>();
        //设置支付参数
        m.put("appid", OrderUtils.WX_APP_ID);
        m.put("mch_id", OrderUtils.MCH_ID);
        m.put("nonce_str", WXPayUtil.generateNonceStr());
        //商品描述 例如:天天爱消除-游戏充值
        m.put("body", "换芯易-" + order.getGoodsModel() + "购买");
        //订单号
        m.put("out_trade_no", order.getOrderSn());
        m.put("total_fee", order.getActualPrice().multiply(new BigDecimal("100")).longValue() + "");
        m.put("spbill_create_ip", clientIp);
        m.put("notify_url", OrderUtils.NOTIFY_URL);
        m.put("trade_type", "JSAPI");
        //trade_type=JSAPI时(即JSAPI支付),必须要openid
        UserThreeDao userThreeDao = new UserThreeDaoImpl();
        UserThree userThree = userThreeDao.queryOpenid(order.getUserId());
        if (userThree == null) {
            return null;
        }
        m.put("openid", userThree.getThreeOpenid());
        //生成签名
        m.put("sign", WXPayUtil.generateSignature(m, OrderUtils.APP_KEY));

        //发送请求,请求路径:UNIFIED_ORDER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder"
        HttpClient client = new HttpClient(OrderUtils.UNIFIED_ORDER_URL);
        //设置xml格式的参数,要把map转为xml
        client.setXmlParam(WXPayUtil.mapToXml(m));
        //设置支持https
        client.setHttps(true);
        //执行请求发送
        client.post();

        //xml转为map接受结果
        Map<String, String> response = WXPayUtil.xmlToMap(client.getContent());
        long end = System.currentTimeMillis();
        System.out.println("请求https://api.mch.weixin.qq.com/pay/unifiedorder耗时:" + (end - be
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对接微信支付,你需要使用微信支付提供的开发工具包(SDK)来实现支付功能。以下是一个简单示例,展示如何使用Java代码对接微信支付: ```java import com.github.wxpay.sdk.WXPay; import com.github.wxpay.sdk.WXPayConfig; import com.github.wxpay.sdk.WXPayConstants; import com.github.wxpay.sdk.WXPayUtil; import java.util.HashMap; import java.util.Map; public class WechatPaymentProgram { public static void main(String[] args) { // 商户号 String mchId = "your_mch_id"; // 商户密钥 String key = "your_mch_key"; // 应用ID String appId = "your_app_id"; // 回调URL String notifyUrl = "your_notify_url"; // 创建配置对象 WXPayConfig config = new WXPayConfig() { @Override public String getAppID() { return appId; } @Override public String getMchID() { return mchId; } @Override public String getKey() { return key; } }; // 创建WXPay对象 WXPay wxPay = new WXPay(config, WXPayConstants.SignType.MD5); // 创建订单参数 Map<String, String> data = new HashMap<>(); data.put("body", "商品描述"); data.put("out_trade_no", "商户订单号"); data.put("total_fee", "订单金额(单位为分)"); data.put("spbill_create_ip", "用户IP地址"); data.put("notify_url", notifyUrl); data.put("trade_type", "NATIVE"); // 扫码支付 try { // 调用统一下单接口 Map<String, String> resp = wxPay.unifiedOrder(data); // 判断返回结果 if ("SUCCESS".equals(resp.get("return_code")) && "SUCCESS".equals(resp.get("result_code"))) { String qrCodeUrl = resp.get("code_url"); // 获取支付二维码链接 System.out.println("请扫描以下二维码进行支付:" + qrCodeUrl); // TODO: 根据实际情况处理支付结果通知等逻辑 } else { System.out.println("下单失败:" + resp.get("return_msg")); } } catch (Exception e) { e.printStackTrace(); } } } ``` 在这个示例中,你需要替换代码中的 `your_mch_id`、`your_mch_key`、`your_app_id`和 `your_notify_url` 分别为你的微信商户号、商户密钥、应用ID和支付结果通知URL。然后根据实际情况填充订单参数,调用统一下单接口获取支付二维码链接,并输出给用户。最后根据微信支付结果通知的回调结果处理支付结果逻辑。 请注意,这只是一个简单的示例,并没有完整考虑所有的异常情况和业务逻辑。在实际应用中,你还需要处理用户扫码支付后的回调通知、订单查询退款等功能。建议阅读微信支付官方文档和相关SDK的使用文档,了解完整的接口和流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值