微信APP支付之IJpay的使用

写在开始:一个搬砖程序员的随缘记录

微信支付相对其他支付,比如支付宝支付坑比较多。一直报签名失败。签名参数顺序、数据类型,加密类型这些都需要注意,用第三方的比较省心。

IJpay介绍:

聚合支付,IJPay 让支付触手可及,封装了微信支付、QQ支付、支付宝支付、京东支付、银联支付、PayPal支付等常用的支付方式以及各种常用的接口。不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。

项目整体目录:

文章目录

  • 一、获取微信APP支付必须的参数
  • 二、项目配置
    • 1、需要引入的的jar包
    • 2、application.yml
    • 3、微信配置类
    • 4、Swagger配置文件
    • 5、微信支付业务实现相关

一、获取微信APP支付必须的参数

1、appId:微信开放平台上面的应用appid
在这里插入图片描述

2、mchId:微信商户号,注意这是登陆的商户平台,不是开放平台了
在这里插入图片描述
3、mchKey:API密钥
登录微信商户平台—>账户中心—>API安全—>设置秘钥
在这里插入图片描述
4、然后在微信开放平台上面的应用支付功能必须是开通的,还要绑定商户平台对应的商户号才可以
在这里插入图片描述
在这里插入图片描述
获取到上面所需要的必须参数下面就开始进行项目配置

二、项目配置

1、需要引入的的jar包

		<!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- swagger-ui --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.5.0</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.5.0</version></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>swagger-bootstrap-ui</artifactId><version>1.8.1</version></dependency><!-- IJPay --><dependency><groupId>com.github.javen205</groupId><artifactId>IJPay-All</artifactId><version>2.2.0</version></dependency><!--fastjson--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.7</version></dependency>

2、application.yml

wxpay:appId: # appidmchId: # 商户号mchKey: # 秘钥notifyUrl: http://127.0.0.1:8080/wxPay/wxPayNotice #微信支付回调地址

3、微信配置类

微信配置参数类
WxPayProperties.Java

package com.cn.wxpay.config;import lombok.Data;
import org.springframework.beans.factory.annotation.Value;/*** @Author: demo* @Date: 2020/9/23 15:51*/
@Data
public class WxPayProperties {/*** appid.*/@Value("${wxpay.appId}")private String appId;/*** 微信支付商户号.*/@Value("${wxpay.mchId}")private String mchId;/*** 微信支付商户密钥.*/@Value("${wxpay.mchKey}")private String mchKey;/*** 异步回调地址*/@Value("${wxpay.notifyUrl}")private String notifyUrl;
}

创建WxPayProperties的实例
WxConfig.Java

package com.cn.wxpay.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @Author: demo* @Date: 2020/9/23 15:51*/
@Configuration
public class WxConfig {@Bean("WxPayProperties")public WxPayProperties wxPayProperties(){return new WxPayProperties();}
}

4、Swagger配置文件

SwaggerConfig.Java

package com.cn.wxpay.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;/*** @Author: demo* @Date: 2020/9/23 15:51*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {@Beanpublic Docket customDocket() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo());}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("swagger RESTful APIs").description("swagger RESTful APIs").termsOfServiceUrl("http://www.test.com/").contact("xiaoymin@foxmail.com").version("1.0").build();}
}

5、微信支付业务实现相关

订单实体类
TblAutoOrderDat.Java

package com.cn.wxpay.entity;import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;import java.math.BigDecimal;
import java.util.Date;/*** @Author: demo* @Date: 2020/9/23 15:51*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "订单实体类")
public class TblAutoOrderDat {@ApiModelProperty(value = "id")private Integer id;@ApiModelProperty(value = "商品描述")private String attach;@ApiModelProperty(value = "交易类型")private String tradeType;@ApiModelProperty(value = "订单号")private String orderId;@ApiModelProperty(value = "订单金额")private BigDecimal totalFee;@ApiModelProperty(value = "微信支付订单号")private String transactionId;@ApiModelProperty(value = "支付时间")private Date payTime;@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")@ApiModelProperty(value = "创建时间")private Date createTime;@ApiModelProperty(value = "创建人")private Integer createUser;@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")@ApiModelProperty(value = "修改时间")private Date updateTime;@ApiModelProperty(value = "创建人")private Integer updateUser;@ApiModelProperty(value = "是否删除 1:已删除 0:未删除")private Boolean isDelete;
}

微信工具类
WxPayUtil.Java

package com.cn.wxpay.util;import java.util.Map;/*** @Author: demo* @Date: 2020/9/23 15:51*/
public class WxPayUtil {/*** 将map转换为xml*/public static String getMapToXml(Map<String, String> param) {StringBuilder sb = new StringBuilder();sb.append("<xml>");for (Map.Entry<String, String> entry : param.entrySet()) {sb.append("<" + entry.getKey() + ">");sb.append(entry.getValue());sb.append("</" + entry.getKey() + ">");}sb.append("</xml>");return sb.toString();}
}

IP转换类
IpKit.Java

package com.cn.wxpay.config;import javax.servlet.http.HttpServletRequest;/*** @author demo* @Date: 2020/9/23 15:51*/
public class IpKit {private final static String UNKNOWN = "unknown";public static String getRealIp(HttpServletRequest request) {String ip = request.getHeader("x-forwarded-for");if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getHeader("Proxy-Client-IP");}if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getHeader("WL-Proxy-Client-IP");}if (ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();}return ip;}public static String getRealIpV2(HttpServletRequest request) {String accessIp = request.getHeader("x-forwarded-for");if (null == accessIp) {return request.getRemoteAddr();}return accessIp;}
}

业务类
WxPayController.Java

package com.cn.wxpay.controller;import com.alibaba.fastjson.JSON;
import com.cn.wxpay.config.IpKit;
import com.cn.wxpay.config.WxPayProperties;
import com.cn.wxpay.entity.TblAutoOrderDat;
import com.cn.wxpay.util.WxPayUtil;
import com.ijpay.core.enums.SignType;
import com.ijpay.core.enums.TradeType;
import com.ijpay.core.kit.WxPayKit;
import com.ijpay.wxpay.WxPayApi;
import com.ijpay.wxpay.model.UnifiedOrderModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;/*** @Author: demo* @Date: 2020/9/23 15:51*/
@RestController
@Slf4j
@RequestMapping("/wxPay")
public class WxPayController {@Autowiredprivate WxPayProperties wxPayProperties;/*** 微信APP支付** @param attach   订单描述:比如会员卡充值、商品名称* @param totalFee 支付金额* @return 微信支付返回*/@GetMapping(value = "/appPay")@ResponseBodypublic Map<String, String> appPay(HttpServletRequest request, @RequestParam("totalFee") BigDecimal totalFee, @RequestParam("attach") String attach) {String ip = IpKit.getRealIp(request);if (StringUtils.isEmpty(ip)) {ip = "127.0.0.1";}Map<String, String> params = UnifiedOrderModel.builder().appid(wxPayProperties.getAppId()).mch_id(wxPayProperties.getMchId()).nonce_str(WxPayKit.generateStr()).body(attach).attach(attach).out_trade_no(WxPayKit.generateStr()).total_fee(String.valueOf(totalFee.multiply(new BigDecimal(100)).intValue())).spbill_create_ip(ip).notify_url(wxPayProperties.getNotifyUrl()).trade_type(TradeType.APP.getTradeType()).build().createSign(wxPayProperties.getMchKey(), SignType.MD5);String xmlResult = WxPayApi.pushOrder(false, params);log.info(xmlResult);Map<String, String> result = WxPayKit.xmlToMap(xmlResult);String returnCode = result.get("return_code");String returnMsg = result.get("return_msg");if (!WxPayKit.codeIsOk(returnCode)) {log.info("错误信息:"+returnMsg);}String resultCode = result.get("result_code");if (!WxPayKit.codeIsOk(resultCode)) {log.info("错误信息:"+returnMsg);}// 以下字段在 return_code 和 result_code 都为 SUCCESS 的时候有返回String prepayId = result.get("prepay_id");Map<String, String> packageParams = WxPayKit.appPrepayIdCreateSign(wxPayProperties.getAppId(), wxPayProperties.getMchId(), prepayId,wxPayProperties.getMchKey(), SignType.MD5);String jsonStr = JSON.toJSONString(packageParams);log.info("返回apk的参数:" + jsonStr);return packageParams;}/*** 微信回调接口*/@PostMapping("/wxPayNotice")public String parseOrderNotifyResult(@RequestBody String xmlData) throws ParseException {Map<String, String> map = new HashMap<>();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");log.info("微信回调开始了");//这里我只进行了部分回调信息的保存,更多参数请查看微信支付官方api:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7&index=8Map<String, String> resultMap = WxPayKit.xmlToMap(xmlData);log.info("resultMap:" + resultMap);/*----------------------分割线,下面的是业务代码,根据自己业务进行修改--------------------------*///订单成功业务处理if ("SUCCESS".equals(resultMap.get("result_code"))) {// 根据resultMap处理订单业务TblAutoOrderDat tblAutoOrderDat = new TblAutoOrderDat();//订单描述,比如:会员卡充值,商品信息tblAutoOrderDat.setAttach(resultMap.get("attach"));//交易类型 比如:JSAPI、NATIVE、APPtblAutoOrderDat.setTradeType(resultMap.get("trade_type"));//商户订单号 商家生成,传给微信返回的tblAutoOrderDat.setOrderId(resultMap.get("out_trade_no"));//订单金额 订单总金额,单位为分,我这里转换成元了tblAutoOrderDat.setTotalFee(new BigDecimal(resultMap.get("total_fee")).divide(new BigDecimal(100)));//微信支付订单号tblAutoOrderDat.setTransactionId(resultMap.get("transaction_id"));//支付完成时间String newDate = resultMap.get("time_end");tblAutoOrderDat.setPayTime(sdf.parse(newDate.substring(0, 4) + "-" + newDate.substring(4, 6) + "-" + newDate.substring(6, 8) + " " + newDate.substring(8, 10) + ":" + newDate.substring(10, 12) + ":" + newDate.substring(12, 14)));//业务实现,把订单信息保存到数据库//tblAutoOrderDatService.add(tblAutoOrderDat);}/*----------------------分割线,业务结束--------------------------*/map.put("return_code", "SUCCESS");map.put("return_msg", "OK");return WxPayUtil.getMapToXml(map);}/*** 根据微信订单号查询订单状态** @param transactionId 微信订单号* @return SUCCESS/FAIL*/@GetMapping("/getOrderStates/{transactionId}")public String getOrderStates(@PathVariable("transactionId") String transactionId) {Map<String, String> params = OrderQueryModel.builder().appid(wxPayProperties.getAppId()).mch_id(wxPayProperties.getMchId()).transaction_id(transactionId).nonce_str(WxPayKit.generateStr()).build().createSign(wxPayProperties.getMchKey(), SignType.MD5);String xml = WxPayApi.orderQuery(false, params);Map<String, String> resultMap = WxPayKit.xmlToMap(xml);log.info("resultMap:" + resultMap);return resultMap.get("result_code");}
}

还有一个在和APP前端对接的问题很坑。官方API的问题.导致后端的签名已经通过.APP拉不起支付。报支付签名验证失败。遇到此类的问题可参考下。
在这里插入图片描述
Over.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/52534.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

滥用 GPT,被抓了.....

点击上方“Java基基”&#xff0c;选择“设为星标” 做积极的人&#xff0c;而不是积极废人&#xff01; 每天 14:00 更新文章&#xff0c;每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路&#xff0c;很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应…

沉浸式学习

沉浸式就是利用系统状态栏&#xff0c;将背景图片延伸至系统状态栏区域内&#xff0c;效果就是和游戏应用画面那样。 Action1 隐藏状态栏和ActionBar 仅仅是隐藏状态栏和ActionBar&#xff0c;只是粗暴的隐藏了而已 //获取当前界面的DecorViewView decorView getWindow().g…

最全整理反面角色谁更适合饰演老大角色,你认识多少?(已收藏)

https://www.toutiao.com/a6662589985889190412/ 2019-02-27 16:11:54 这些演艺界的大佬&#xff0c;哪位更适合饰演反面角色的老大&#xff0c;你觉得的呢&#xff1f; 排名不分前后 【万梓良】 香港娱乐圈内有很多自带大哥气质的演员&#xff0c;万梓良就是其中之一。 他在…

“引进来,走出去”,锦江国际集团多重创新力引领绿色新发展

2022年12月13日&#xff0c;由南方财经全媒体集团指导&#xff0c;21世纪经济报道主办的“21世纪住宿业高峰论坛&#xff08;2022&#xff09;暨2022&#xff08;第十九届&#xff09;【金枕头】酒店大赏发布典礼”在上海如期举行。锦江国际集团副总裁周维应邀出席并发表“创新…

PDF文档翻译中文的方法

1.如果你的文档容量不大&#xff0c;可以尝试使用谷歌翻译进行文档翻译&#xff0c;可以看到谷歌翻译支持的文档类型有 .doc、.docx、.odf、.pdf、.ppt、.pptx、.ps、.rtf、.txt、.xls 和 .xlsx 不过值得注意的是&#xff0c;谷歌翻译支持的文档容量仅为1MB 2.同样是基于谷歌…

如何将英文PDF翻译成中文且格式不变?(PDF免费翻译攻略)

如何将英文PDF翻译成中文且格式不变 方法1&#xff1a;转换成HTML后再使用谷歌浏览器翻译保存为PDF方法2&#xff1a;使用一些第三方PDF翻译网站最后博主采用了福昕翻译网站在线翻译的方法。 Hello&#xff0c;小伙伴们&#xff01; 博主最近想要将一份英文的pdf帮助文档转换成…

用python写一个PDF翻译软件

前期工作&#xff1a; 注册 百度翻译api的账户&#xff08;个人-高级版&#xff09;&#xff0c;注册后&#xff0c;每个月有2百万的免费翻译字符数。 安装pdfminer3k 一、UI界面设计 点击路径按钮时弹出文件目录选择窗口&#xff0c;参考文章&#xff1a; PYQT5实现文件目…

使用TCPDF插件生成pdf以及pdf的中文处理

做了这么多年项目&#xff0c;以前只是在别人的项目中了解过php生成pdf文件&#xff0c;知道并不难&#xff0c;但是涉及到了pdf开发库&#xff0c;首先介绍pdf库。 多种多样的pdf开发库 1.WKHTMLTOPDF wkhtmltopdf是一个很好的解决方案&#xff0c;基本上可以原样输出html页面…

pdf文件如何进行翻译?pdf文件翻译方法分享。

pdf文件如何进行翻译&#xff1f;在日常的工作和学习当中&#xff0c;很多小伙伴都需要接受到pdf文件&#xff0c;需要我们对pdf文件进行翻译或者处理&#xff0c;那么众所周知dpf文件因为不可编辑性&#xff0c;从而变的特别特别的安全&#xff0c;深受大家的喜爱&#xff0c;…

推荐几种可以直接翻译PDF英文文献的方法

大家在阅读英文文献的时候&#xff0c;可能会经常碰到这样的情况&#xff1a;由于作者使用了各种从句&#xff0c;明明只是一句话&#xff0c;却写成很长的一段&#xff0c;即使其中没有生词&#xff0c;看了几遍也弄不懂它的意思。如果句子里再夹杂了几个看不懂的英文单词&…

英文PDF怎么翻译成中文?两分钟让你学会翻译PDF

现在大部分的文件资料都是以PDF的格式保存的&#xff0c;这是因为PDF格式可以跨设备打开的时候&#xff0c;不会影响到内容的排版格式。在撰写论文的时候&#xff0c;我们常需要查阅各种文献资料&#xff0c;尤其是会参考英文文献。小伙伴们平时遇到不懂的词句&#xff0c;是怎…

pdf翻译器哪个好?这几个pdf翻译软件能支持一键翻译

有没有从事外贸行业的小伙伴经常收到国外客人发送的外文文档呢&#xff1f;通常这些文档除了是外文语言外&#xff0c;还是pdf格式的。外文不熟的朋友&#xff0c;肯定是对文档一窍不通吧。如果我们用一些pdf翻译器来翻译文档的话&#xff0c;我们就不用费心去研究该文档的意思…

推荐几个好用的pdf翻译工具

开始用的是网易有道词典&#xff0c;排版和准确度都不错&#xff0c;效果如下&#xff0c;只是收费 后来在网上找了一下&#xff0c;大部分工具&#xff0c;要不收费要不排版不行&#xff0c;或者只是划词翻译&#xff0c;也没有ocr识别 最后找了两个网站 https://fanyi.atm…

PDF如何翻译成中文?三种方法教你怎样翻译PDF上的文字

小伙伴们在学习或工作中遇到外国文章时是不是会先翻译成中文再阅读呢&#xff1f;如果文章是word或者txt格式&#xff0c;我们可以直接复制文字进行翻译。但是有些文章为了看起来美观可能会生成PDF格式&#xff0c;我们想翻译的话&#xff0c;就需要先把格式转换成word等方便编…

PDF怎么翻译成中文?这些方法值得收藏

小伙伴们平时接触英文PDF文件的机会多吗&#xff1f;虽然可能平时接触的少&#xff0c;可是一旦接触就会很痛苦&#xff0c;因为有的PDF文件里面会充斥着大量深奥的词汇。对于这些深奥的词汇&#xff0c;小伙伴们都是采取什么方法呢&#xff1f;是逐个逐个拿去翻译吗&#xff1…

福昕pdf阅读器的划词翻译功能如何添加(图文并茂)

一、打开福昕阅读器 二、可在上方工具栏&#xff0c;点击“帮助”&#xff0c;关于福昕阅读器领鲜版查看安装的版本信息&#xff0c;如图1-1&#xff0c;图1-2 图1-1 图1-2 三、找到上方工具栏的图标按键&#xff0c;名为“自定义快速访问工具栏”&#xff0c;如图1-3&#…

怎么把PDF翻译成中文?教你便捷翻译方法

怎么把PDF文件的内容给翻译成中文呢&#xff1f;对于PDF文件&#xff0c;大家在日常中经常会使用到&#xff0c;在办公中收到一份英文的PDF文件&#xff0c;或者是我们在网站上下载资料&#xff0c;发现是看不懂的英文&#xff0c;这时候我们怎么将文件内容给翻译成中文呢&…

我进入银行科技部半年,已经丧失跳槽的能力了!

大家好&#xff0c;我是小猿 学弟分享 我是一个杭州双非的本科生&#xff0c;2022届毕业之后进了某银行的科技部工作&#xff0c;年包 20w。 当时想着在银行也算是一份安稳的工作&#xff0c;因此选择了给钱最多的一个&#xff0c;想着自己走上了金融 科技的赛道。 在去之前也…

社交媒体用户行为研究,图神经网络 社交网络

产品经理如何做用户行为分析&#xff1f; 在这个每个互联网人都在谈论数据&#xff0c;每个产品经理都在谈论数据分析的时代&#xff0c;用户行为分析的重要性也越来越凸显出来&#xff0c;那么产品经理如何做用户行为分析呢&#xff1f;接下来将为大家进行分享。 一、为什么…

从伊朗虚假新闻活动案例来看国外造谣及传谣模式

曾经我发过下面这篇文章 里面提到了伊朗如何进行假新闻构造然后进行传播 而实际上&#xff0c;假新闻的传播模式&#xff0c;在国外一成一套流水线&#xff0c;与国内的微博&#xff0c;微信公众号&#xff0c;朋友圈&#xff0c;匿名论坛等方式截然不同。 下面通过一起伊朗针对…