首页 > 基础资料 博客日记
java 对接微信支付代码(app支付)
2023-08-07 17:23:12基础资料围观288次
Java资料网推荐java 对接微信支付代码(app支付)这篇文章给大家,欢迎收藏Java资料网享受知识的乐趣
java 对接微信支付代码(app支付)
最近对接微信支付功能,去网上找了一大堆文章结果要么是文章太古老已经无法照搬,要么就是写的太多太乱小白根本看不懂,决定贴出自己代码以作参考
一、微信商户平台申请相关能力 获得相关的参数APPID,MCHID,KEY 这步不多做介绍了
二、引入maven
<dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId> <version>0.0.3</version> </dependency>
三、构建Config类 配置基本参数(注意这里的WxConfig是我存第一步申请的参数的类,包括APPID,MCHID,KEY)
import com.github.wxpay.sdk.WXPayConfig; import org.springframework.stereotype.Service; import java.io.ByteArrayInputStream; import java.io.InputStream; /** * 微信支付配置类 */ @Service public class MyConfig implements WXPayConfig { private byte[] certData; @Override public String getAppID() { return WXConfig.APP_ID; } @Override public String getMchID() { return WXConfig.MCH_ID; } @Override public String getKey() { return WXConfig.KEY; } @Override public InputStream getCertStream() { ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData); return certBis; } @Override public int getHttpConnectTimeoutMs() { return 8000; } @Override public int getHttpReadTimeoutMs() { return 10000; } }
四、支付下单工具类,请求参数为系统内订单号、钱数、客户端ip (WXConfig同样的配置参数文件,ServiceException是自定义继承RuntimeException的一个异常类)
import com.github.wxpay.sdk.WXPay; import com.github.wxpay.sdk.WXPayUtil; import com.ruoyi.common.core.exception.ServiceException; import org.apache.commons.codec.digest.DigestUtils; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; public class WXPayExample {public static Map<String, String> wxPayCert(String outtradeno,String money,String ip) throws Exception { MyConfig config = new MyConfig(); WXPay wxpay = new WXPay(config); Map<String, String> data = new HashMap<String, String>(); String nonce_str = WXPayUtil.generateNonceStr(); data.put("body", "充值"); data.put("out_trade_no", outtradeno); data.put("nonce_str", nonce_str); // data.put("device_info", ""); data.put("fee_type", "CNY"); data.put("total_fee", money);//金额单位为分 data.put("notify_url", WXConfig.NotifyUrl);//回调地址,公网域名必须为https data.put("spbill_create_ip", ip);//用户的客户端IP data.put("trade_type", "APP"); // 此处指定为app支付 // data.put("product_id", "12"); try { Map<String, String> resp = wxpay.unifiedOrder(data); if (resp==null) { throw new ServiceException("充值接口调用失败"); } if (!"SUCCESS".equals(resp.get("return_code"))) { throw new ServiceException(resp.get("return_msg")); } if (!"SUCCESS".equals(resp.get("result_code"))) { throw new ServiceException(resp.get("err_code_des")); } Map<String, String> resultMap = new LinkedHashMap<>(); resultMap.put("appid", WXConfig.APP_ID); resultMap.put("noncestr", nonce_str); resultMap.put("package", "Sign=WXPay"); resultMap.put("partnerid", WXConfig.MCH_ID); resultMap.put("prepayid", resp.get("prepay_id")); resultMap.put("timestamp", System.currentTimeMillis() / 1000 + ""); StringBuilder result = new StringBuilder(); for (Map.Entry<String, String> entry : resultMap.entrySet()) { result.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } result.append("key=").append(WXConfig.KEY); resultMap.put("sign", DigestUtils.md5Hex(result.toString()).toUpperCase()); return resultMap; } catch (Exception e) { throw new ServiceException("微信支付异常"); } } }
五、回调函数:微信支付下单之后用户是否支付成功微信官方会发送一条请求给我们的回调接口
/** * 微信回调 */ @PostMapping("wxpay_callback") public String wxpaySend(HttpServletRequest request) throws AlipayApiException {try { // 读取参数 // 解析xml成map Map<String, String> map = WXPayUtil.xmlToMap(getParam(request)); BbOrder order = check(map);//该处读者自行校验(验证订单号,付款金额等是否正确) String orderNo = map.get("out_trade_no"); String resultCode = map.get("result_code"); // 另起线程处理业务 // 支付成功 if ("SUCCESS".equals(resultCode)) { logger.info("支付成功");
// 处理支付成功的逻辑
} else {
//处理支付失败的逻辑 logger.info("支付失败"); } if ("SUCCESS".equals(resultCode)) { return setXml("SUCCESS", "OK"); } else { return setXml("fail", "付款失败"); } } catch (ServiceException e) { logger.info("微信支付回调发生异常{}", e.getMessage()); return setXml("fail", "付款失败"); } catch (Exception e) { logger.info("微信支付回调发生异常{}", e.getLocalizedMessage()); return setXml("fail", "付款失败"); } } private String getParam(HttpServletRequest request) throws IOException { // 读取参数 InputStream inputStream; StringBuilder sb = new StringBuilder(); inputStream = request.getInputStream(); String s; BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); while ((s = in.readLine()) != null) { sb.append(s); } in.close(); inputStream.close(); return sb.toString(); } private BbOrder check(Map<String, String> params) throws ServiceException { String outTradeNo = params.get("out_trade_no"); // 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号, // 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额), Integer totalAmount = Integer.valueOf(params.get("total_fee"));return order; } // 通过xml发给微信消息 private static String setXml(String return_code, String return_msg) { SortedMap<String, String> parameters = new TreeMap<>(); parameters.put("return_code", return_code); parameters.put("return_msg", return_msg); try { return WXPayUtil.mapToXml(parameters); } catch (Exception e) { return "<xml><return_code><![CDATA[" + return_code + "]]>" + "</return_code><return_msg><![CDATA[" + return_msg + "]]></return_msg></xml>"; } }
六、微信支付圆满ok
文章来源:https://www.cnblogs.com/void--main/p/16532051.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: