这篇文章只是说一下个人的实现思路,大家了解一下实现的思路就行了,并不是全流程可以粘贴复制就能用的案例,个人觉得整体比较麻烦的地方就是前期准备工作,你要去注册账号获取 商户ID 商户证书,商户证书下载后直接拉进项目里,后期需要读取证书里面的序列号。我放到resources下了,也就是我项目的所有的xml文件目录。放哪里都行。

1.前期准备
需要去微信公众平台注册账号,获取APPID 商户证书等参数,这里不细说了可以具体看以下链接:https://blog.csdn.net/qq_41693150/article/details/102488653

2.前期准备完成后,项目中需要导入微信的工具包,这是我自己用的包可以下载
链接:https://pan.baidu.com/s/1IO2Y3YQhN_hUCqXhrg9ksw
提取码:ABBS

下面是我的案例(我拿APP支付来说)官方API地址:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_1.shtml

在这先说下我的实现逻辑,我做的是订单支付,订单的订单号、订单ID、用户手机号等等参数这些都不说了,这是你自己的东西跟微信没关系,你支付的时候只是需要把你的支付金额、订单号(自己生成的)调用微信支付接口的时候传过去就行了(还有微信官方上写的必填参数)。


看着微信的官方文档把需要的参数传过去就行了,微信也给的有官方示例

{"mchid": "1900006XXX","out_trade_no": "APP1217752501201407033233368018","appid": "wxb4ba3c02aa476XXX","description": "Image形象店-深圳腾大-QQ公仔","notify_url": "https://weixin.qq.com/","amount": {"total": 1,"currency": "CNY"}
}

上面的是官网的例子, 下面是我实现的例子,封装参数,读取证书里的序列号

orderNum:订单号,payMoney:支付金额,APP:app端支付(小程序就写成JSAPI),subject这个参数不用管 是我自己加了个识别的参数,ip:支付完成后微信回调的通知地址,openid:小程序支付的时候用。

resPayObj = WechatPayUtil.creatOrder_v3(orderNum, payMoney, "APP", subject, null,"".equals(ip) ? "127.0.0.1" : ip, null,"");
    public static JSONObject creatOrder_v3(String orderNum, BigDecimal total, String tradeType, String body, String detail, String ip, String openid, String appid) {JSONObject json_param = new JSONObject();JSONObject amount = new JSONObject();JSONObject payer = new JSONObject();DateTimeFormatter ldt = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");String URL = "";if (StrKit.notBlank(openid)) {URL = D1BusWebConfig.WECHAT_JSAPI_URL;if(StrKit.isBlank(appid))appid = D1BusWebConfig.DD_WEHCAT_MINIPROGRAM_APPID;//小程序appidjson_param.put("appid", appid);payer.put("openid",openid);json_param.put("payer", payer);}else if(tradeType.equals("H5")){URL = D1BusWebConfig.WECHAT_H5_URL;if(StrKit.isBlank(appid))  appid = D1BusWebConfig.DD_WECHAT_APPID;//应用IDjson_param.put("appid", appid);} else {URL = D1BusWebConfig.WECHAT_APP_URL;if(StrKit.isBlank(appid))  appid = D1BusWebConfig.DD_WECHAT_APPID;//应用IDjson_param.put("appid", appid);}json_param.put("mchid", D1BusWebConfig.DD_WECHAT_MCH_ID);//直连商户号if (StringUtils.isNotEmpty(detail)) {json_param.put("description", detail);//商品描述}else{json_param.put("description", "订单支付");//商品描述}json_param.put("out_trade_no", orderNum);//商户订单编号json_param.put("notify_url", D1BusWebConfig.WECHAT_CALLBLACK_ORDER_URL);// 通知URL必须为直接可访问的URL,不允许携带查询串。//订单金额amount.put("total", (int)(total.floatValue()*100));//订单总金额,单位为分。所以*100amount.put("currency", "CNY");json_param.put("amount", amount);if(tradeType.equals("H5")){JSONObject json = new JSONObject();JSONObject js = new JSONObject();json.put("payer_client_ip","127.0.0.1");js.put("type","Wap");json.put("h5_info",js);json_param.put("scene_info", json);}String jsonStr = "";JSONObject resObj = new JSONObject(16, true);try {//读取证书里的序列号,在调用微信支付的时候作为参数传过去PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(new FileInputStream(D1BusWebConfig.WEIXINPAY_PRIVATEKEY+"apiclient_key.pem"));File file = new File(D1BusWebConfig.WEIXINPAY_certificate+"614DDE7717364EEBF4DBB95AC15A2623B256ACA4.pem");BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件String s = null;StringBuilder result = new StringBuilder();while((s = br.readLine())!=null){//使用readLine方法,一次读一行result.append(System.lineSeparator()+s);}br.close();String certificate = result.toString();String preOrder = WXPayRequest.requestOncePOST(URL,json_param.toJSONString(), D1BusWebConfig.DD_WECHAT_MCH_ID,D1BusWebConfig.WECHAT_MERCHANTSERIANUMBER,merchantPrivateKey, certificate);System.out.println(preOrder);JSONObject json = (JSONObject) JSONObject.parse(preOrder);if(json.getString("prepay_id") == null){return resObj;}String prepay_id = json.getString("prepay_id");if (StrKit.notBlank(openid)) {resObj.put("appId", appid);resObj.put("nonceStr", WXPayUtil.generateNonceStr());resObj.put("package", "prepay_id=" + prepay_id);resObj.put("signType", "MD5");resObj.put("timeStamp", System.currentTimeMillis() / 1000 + "");} else {resObj.put("appid", appid);resObj.put("noncestr", WXPayUtil.generateNonceStr());resObj.put("package", "Sign=WXPay");resObj.put("partnerid", D1BusWebConfig.DD_WECHAT_MCH_ID);resObj.put("prepayid", prepay_id);// 预支付idresObj.put("timestamp", System.currentTimeMillis() / 1000 + "");}resObj.put(WXPayConstants.FIELD_SIGN, createSign("UTF-8", resObj));resObj.put("status", 1);} catch (Exception e) {Tools.LogOut("WechatPayUtil::creatOrder", "creatOrder_v3ERROR==" + e.toString());}Tools.LogOut("WechatPayUtil::creatOrder", "creatOrder_v3==" + resObj.toJSONString());return resObj;}

post方法

    public static String requestOncePOST(String url, String data, String merchantId, String merchantSerialNumber,PrivateKey merchantPrivateKey, String certificate ){String res = "";try {Tools.LogOut("WXPayRequest::requestOncePOST", "url ==" + url + "     \ndata ==" + data);KeyFactory kf = KeyFactory.getInstance("RSA");CertificateFactory cf = CertificateFactory.getInstance("X.509");ArrayList<X509Certificate> listCertificates = (ArrayList<X509Certificate>) cf.generateCertificates(new ByteArrayInputStream(certificate.getBytes("utf-8")));WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create().withMerchant(merchantId, merchantSerialNumber, merchantPrivateKey).withWechatpay(listCertificates);CloseableHttpClient httpClient = builder.build();HttpPost httpPost = new HttpPost(url);InputStream stream = new ByteArrayInputStream(data.getBytes("utf-8"));InputStreamEntity reqEntity = new InputStreamEntity(stream);reqEntity.setContentType("application/json");httpPost.setEntity(reqEntity);httpPost.addHeader("Accept", "application/json");CloseableHttpResponse httpResponse = httpClient.execute(httpPost);HttpEntity httpEntity = httpResponse.getEntity();res = EntityUtils.toString(httpEntity, "UTF-8");Tools.LogOut("WXPayRequest::requestOncePOST", "url ==" + url + "     \nres ==" + res);} catch (Exception e) {e.printStackTrace();Tools.LogOut("WXPayRequest::requestOncePOST", "ERR ==" + e.toString());}return res;}

Java 微信支付APP V3示例思路相关推荐

  1. 微信支付API V3版本JAVA开发指南

    微信支付版本V3的Demo,在官方上下载下来,压根就是不能直接用的东西,你要想学会用,你就得一层一层的看源码,看文档,要求你事无巨细的做一个接入者. 如果接入API需要让人看源码来理解,我觉得是一件让 ...

  2. java微信支付v3系列——6.微信支付查询订单API

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  3. java微信支付v3系列——4.创建订单的封装及使用

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  4. java微信支付v3系列——5.微信支付成功回调

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  5. java微信支付v3系列——3.订单创建准备操作

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  6. java微信支付代码_Java微信支付之服务号支付代码示例

    Java微信支付之服务号支付实现,网上的java微信支付sdk和Demo基本上是水的,看着头疼所以我决心自己开始写Java微信支付之公众号支付,多的不说见下面源码,为了方便使用我分别用了两个Servl ...

  7. 微信支付 APP支付 Java 服务器端

    微信支付 APP支付 Java 服务器端 本文介绍微信支付中APP支付的java服务端. 微信APP支付文档:https://pay.weixin.qq.com/wiki/doc/api/app/ap ...

  8. java微信支付v3系列——1.微信支付准备工作

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  9. java微信支付v3系列——7.微信支付之申请退款

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

最新文章

  1. c语言程序设计上机考试占多少分,C语言程序设计上机考试题目汇编.doc
  2. 学校通知,本学期不用返校了
  3. android handler的机制和原理_一文搞懂handler:彻底明白Android消息机制的原理及源码
  4. python spider code
  5. 猪流感来了,我们做好准备了吗
  6. 2019ICPC(徐州) - Who is better?(中国剩余定理+斐波那契博弈)
  7. R语言blotter包及相关工具
  8. tfpose与openpose区别_人体姿态识别--Openpose+Tensorflow
  9. Android 获取信号强度
  10. 1:1 人脸比对 开源_打破5个神话:在高等教育中使用开源
  11. 雷军:全面屏新零售微信都是我先提的,为什么你们只记住了苹果马云张小龙?
  12. 阿里云ECS服务器搭建Nginx+PHP+MySql+Redis环境详细步骤(CentOS7环境)
  13. javascript循环语句及函数
  14. 大规模分布式深度网络
  15. [动画特效] 炫彩界面库-动画特效来了,可实现各种网页特效v3.3.0
  16. windows11安装日语输入法(添加输入法)
  17. cer pem 证书转换_Cer Crt Pem Pfx 证书格式转换
  18. 制作京东登陆页面 HTML+CSS
  19. 左联接、右联接、内联接、自然联接
  20. c语言编写51单片机中断程序,执行过程是怎样的?

热门文章

  1. python turtle 画老鼠_Python Turtle绘图 鼠年画老鼠爷
  2. 华为mt2l01 android5.1,华为 MT2_5.1.1 ROM 刷机包 电信Flyme 5.1.5.27R自用稳定
  3. dnf服务器未响应怎么解决方法,DNF未响应的原因分析与解决方法
  4. php实现7天礼包发放,php 生成游戏兑换码(礼包)方法
  5. [区域链]以太开发中ethers库的使用
  6. 1.7.2服务器修改器,关于S7修改器V1.72的问题
  7. 整理的Python语法速览与实战清单,零基础注意查收!
  8. Snackbar的显示位置以及字体颜色字体大小背景修改
  9. 我的VUE3逆袭笔记~
  10. Unexpected end of JSON input while parsing near ‘...-----END PGP SIGNATUR‘