基于springboot的微信公众号JSAPI支付

最近做了一个电商项目,写了微信公众号支付和封装的app支付。用法是大同小异。
在次之前,你需要先了解一下,微信支付的 开发文档。
具体的返回信息,参考开发文档,这里主要是把核心代码和流程写了一下。微信JSAPI支付
转载需注明:https://blog.csdn.net/juan1997/article/details/90647747
百度网盘下载链接
链接:https://pan.baidu.com/s/1Jvm_Tul-Wjd8dI186CPQ_w
提取码:4tpi
一、往pom.xml文件引入包


			
				com.egzosn
				pay-java-common
				2.12.4
			
		
			
				com.egzosn
				pay-java-wx
				2.12.4
			

二、在application.yml文件配置微信公众的基础信息。 填写自己的公众号的信息

#  微信公众号支付配置
		weixinpay:
			  mchId:  # 商户Id
			  storePassword:  # 秘钥支付密码
			  appid: 
			  secretKey:  # 秘钥
			  notifyUrl:  #微信支付回调
			  keystore:    # 证书所在位置
			  
		# app微信支付
		appweixinpay:
			  mchId: 
			  appid: 
			  secretKey: 
			  notifyUrl: 
			  keystore: 
			  storePassword: 	

三、创建它所对应的配置信息

/**
		 * 微信公众号的配置信息
		 * @author juan
		 *
		 */
		@Data
		@Component
		@ConfigurationProperties(prefix = "weixinpay")
		public class WeixinAccPayConfig {
			private String mchId;
			private String appid;
			private String secretKey;
			private String notifyUrl;
			private String keystore;
			private String storePassword;
		}		
     
        /**
		 * app微信支付的配置信息
		 * @author juan
		 *
		 */
		@Data
		@Component
		@ConfigurationProperties(prefix = "appweixinpay")
		public class AppWeixinAccPayConfig {
			private String mchId;
			private String appid;
			private String secretKey;
			private String notifyUrl;
			private String keystore;
			private String storePassword;
		}	

四、逻辑代码的实现

/**
		 * 微信公众号的controller类。app的微信支付和公众号的微信支付大同小异。简单地来说就是把WeixinAccPayConfig换成AppWeixinAccPayConfig就可以了。
		 * @author juan
		 *
		 */
		@RestController
		@RequestMapping("/accPay")
		public class WeiXinAccPayController{
			@Autowired
			WeixinAccPayConfig weixinpayConfig;//微信公众号。
			private PayService service = null;
			@PostConstruct
			public void init() {
				WxPayConfigStorage wxPayConfigStorage = new WxPayConfigStorage();
				wxPayConfigStorage.setMchId(weixinpayConfig.getMchId()); // 合作者id(商户号
				wxPayConfigStorage.setAppid(weixinpayConfig.getAppid()); // 应用id
				wxPayConfigStorage.setSecretKey(weixinpayConfig.getSecretKey()); // 密钥
				wxPayConfigStorage.setNotifyUrl(weixinpayConfig.getNotifyUrl()); // 异步回调地址 http://域名:端口号/项目名/回调接口名称
				wxPayConfigStorage.setSignType(SignUtils.MD5.name());
				wxPayConfigStorage.setInputCharset("utf-8");
				// 支付api证书设置,退款必须 方式一
				HttpConfigStorage httpConfigStorage = new HttpConfigStorage();
				httpConfigStorage.setKeystore(weixinpayConfig.getKeystore());// 支付密钥存放位置 文件是以.p12为后缀名字
				httpConfigStorage.setStorePassword(weixinpayConfig.getStorePassword());
				// 是否为证书地址
				httpConfigStorage.setPath(true);
				service = new WxPayService(wxPayConfigStorage, httpConfigStorage);
				// 请求连接池配置
				// 最大连接数
				httpConfigStorage.setMaxTotal(20);
				// 默认的每个路由的最大连接数
				httpConfigStorage.setDefaultMaxPerRoute(10);
				service.setRequestTemplateConfigStorage(httpConfigStorage);
			}
			@ApiOperation("返回订单信息")
			@RequestMapping(value = "weixinpay", method = RequestMethod.POST)
			public Map weixinpay(HttpServletRequest request,在这里可以加前台需要向后台传递的参数) {
			    //备注:这个可以获取预支付的订单,根据需要调用这个接口,可有前台向后台传递参数。然后后台根据需要进行处理。
				init();
				// 在这一步,可以传入一个订单Id,自行去搜索订单信息,并填写以下内容
				PayOrder payOrder = new PayOrder();// 这个就是支付成功后,在微信支付里面返回的信息(支付订单信息)
				// 一下内容需要分情况而定,自行填写。
				payOrder.setSubject("商品名称");
				payOrder.setBody("商品描述");
				payOrder.setAddition("附加信息");
				payOrder.setPrice(new BigDecimal(0.2));// 价格
				payOrder.setOutTradeNo("商户订单号");
				payOrder.setBankType("银行卡类型");
				payOrder.setDeviceInfo("设备信息");
				payOrder.setSpbillCreateIp("支付创建ip");// 可用IPUtils.getIpAddr(request)
				payOrder.setOpenid("用户微信openid");
				payOrder.setTransactionType(WxTransactionType.JSAPI);// 支付方式
				Map orderInfo = service.orderInfo(payOrder);// 返回创建的订单信息
				logger.debug("获取预支付订单信息回参" + orderInfo.toString());
				// 可自行选择 ,是否将支付的流水插入到数据库中。返回的信息由:signType appId timeStamp nonceStr package sign
				return R.ok().put("orderInfo", orderInfo);
			}
			/**
			 * 这就是支付回调地址
			 * 
			 * @param request
			 * @return
			 * @throws IOException
			 */
			@ApiOperation("回调地址")
			@RequestMapping(value = "weixinpayBack")
			public String payBack(HttpServletRequest request) throws IOException {
				init();
				// 获取支付方返回的对应参数
				Map params = service.getParameter2Map(request.getParameterMap(), request.getInputStream());
				if (null == params) {
					logger.debug("通知失败");
					return service.getPayOutMessage("failed", "通知失败").toMessage();
				}
				logger.debug("微信公众号支付结果通知:" + params.toString());
				// 校验
				if (service.verify(params)) {
					// 这里处理业务逻辑 支付成功后的代码逻辑块
					// ......业务逻辑处理块........
					logger.debug("通知支付成功");
					return service.getPayOutMessage("success", "支付成功").toMessage();
				}
				logger.debug("通知支付失败");
				return service.getPayOutMessage("fail", "支付失败").toMessage();
			}
            @ApiOperation("微信公众号退款")
			@RequestMapping(value = "weixinAccRefund")
			public R weixinRefund(这里可以写前台需要向后台传递的参数) {
				init();
				RefundOrder refundOrder = new RefundOrder();//退款订单信息
				refundOrder.setRefundNo("退款单号,每次进行退款的单号,此处唯一");
				refundOrder.setTradeNo("支付平台订单号,交易号");
				refundOrder.setOutTradeNo("商户单号");
				refundOrder.setRefundAmount(new BigDecimal(0.2));//退款金额
				refundOrder.setTotalAmount(new BigDecimal(0.5));//订单总金额
				refundOrder.setOrderDate(new Date());//退款交易日期
				refundOrder.setDescription("退款说明");
				Map refund = service.refund(refundOrder);//微信退款
				//退款成功后,写其他的逻辑
				logger.debug("微信公众号退款结果:=" + refund.toString());
				
				return R.ok();

			} 
		}		

你可能感兴趣的:(微信公众开发基础)