提交 72312e11 authored 作者: zhouzhigang's avatar zhouzhigang

--no commit message

上级 3f8b9afd
package com.zrqx.third.pay.controller;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
......@@ -11,16 +22,26 @@ import com.zrqx.core.client.form.third.pay.CloseForm;
import com.zrqx.core.client.form.third.pay.RefundForm;
import com.zrqx.core.client.form.third.pay.RefundQueryForm;
import com.zrqx.core.client.form.third.pay.ToPayForm;
import com.zrqx.core.client.third.PayClient;
import com.zrqx.core.client.vo.order.OrderPayVo;
import com.zrqx.core.client.vo.third.pay.payquery.PayQueryReturnVo;
import com.zrqx.core.client.vo.third.pay.refundquery.BaseRefundQueryReturnVo;
import com.zrqx.core.client.vo.third.wechart.WecartPayReturn;
import com.zrqx.core.enums.third.pay.PayTypeEnum;
import com.zrqx.core.enums.third.pay.WeChartType;
import com.zrqx.core.exception.BaseException;
import com.zrqx.core.util.datatype.DateUtils;
import com.zrqx.core.util.response.CallBack;
import com.zrqx.core.util.spring.SpringContextUtils;
import com.zrqx.third.pay.config.WXPay;
import com.zrqx.third.pay.config.WXPayConfig;
import com.zrqx.third.pay.config.WXPayUtil;
import com.zrqx.third.pay.interfaces.payType.PayTypeInterface;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RestController
@RequestMapping("/pay")
@Api(description = "支付")
......@@ -29,6 +50,23 @@ public class PayController {
@Autowired
private SpringContextUtils springContext;
@Autowired
private PayClient payClient;
@Autowired
private WXPayConfig config;
// 设备号,pc端填写WEB
@Value("${pay.wechatpay.device_info}")
private String device_info;
// 终端IP,公司ip为122.14.50.6
@Value("${pay.wechatpay.spbill_create_ip}")
private String spbill_create_ip;
// 扫码回调地址
@Value("${pay.wechatpay.notify_url}")
private String notify_url;
@ApiOperation("测试")
@GetMapping("/test")
public BaseRefundQueryReturnVo test(String payType){
......@@ -54,6 +92,126 @@ public class PayController {
return springContext.getEnumsBindBean(PayTypeEnum.class, payType, PayTypeInterface.class).query(out_trade_no);
}
@ApiOperation("获取微信支付配置")
@GetMapping("/query/config")
public CallBack<WecartPayReturn> queryConfig(String out_trade_no, String payType, String trade_type){
ToPayForm toPayForm = new ToPayForm();
toPayForm.setOut_trade_no(out_trade_no);
toPayForm.setPayType(payType);
toPayForm.setTrade_type(trade_type);
log.info("wwwwwwwwwwwwwwwwwwww订单:" + out_trade_no + "开始获取微信链接wwwwwwwwwwwwwwwwwwww");
OrderPayVo orderPayVo = getOrderPayVo(out_trade_no);
WXPay wxpay;
try {
wxpay = new WXPay(config);
//临时远程返回金额
String tempData = orderPayVo.getPayment();
//微信支付需要金额
// 元换算为 分
String realData = wechartPrice(tempData);
// 计算订单的交易起始时间和结束时间
Date start = orderPayVo.getCreateTime();
// 结束时间为订单创建时间的一小时后
Date end = DateUtils.addDateHour(start, 24);
String startStr = DateUtils.dateTimeToStr(start, DateUtils.DATE_TIME_FORMAT_YYYYMMDDHHMISS);
String endStr = DateUtils.dateTimeToStr(end, DateUtils.DATE_TIME_FORMAT_YYYYMMDDHHMISS);
Map<String, String> data = new HashMap<String, String>();
data.put("trade_type", WeChartType.getName(trade_type));
data.put("device_info", device_info);
data.put("spbill_create_ip", spbill_create_ip);
data.put("notify_url", notify_url);
data.put("time_start", startStr);
data.put("time_expire", endStr);
data.put("body", orderPayVo.getSubject());
data.put("out_trade_no", toPayForm.getOut_trade_no());
data.put("total_fee", realData);
data.put("product_id", String.valueOf(orderPayVo.getId()));
if(WeChartType.JSAPI.getCode().equals(toPayForm.getTrade_type())){
data.put("openid", toPayForm.getOpenid());
}
Map<String, String> resp = wxpay.unifiedOrder(data);
if (resp == null)
return null;
//Object obj = beanClass.newInstance();
BeanInfo beanInfo = Introspector.getBeanInfo(WecartPayReturn.class); // 获取类属性
WecartPayReturn wecartPayReturn = new WecartPayReturn(); // 创建 JavaBean 对象
// 给 JavaBean 对象的属性赋值
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (int i = 0; i< propertyDescriptors.length; i++) {
PropertyDescriptor descriptor = propertyDescriptors[i];
String propertyName = descriptor.getName();
if (resp.containsKey(propertyName)) {
// 下面一句可以 try 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。
Object value = resp.get(propertyName);
Object[] args = new Object[1];
args[0] = value;
descriptor.getWriteMethod().invoke(wecartPayReturn, args);
}
}
if(WeChartType.JSAPI.getCode().equals(toPayForm.getTrade_type())){
//拼装参数
Map<String,String> map =new HashMap<String,String>();
String timestamp = String.valueOf(new Date().getTime()/1000);
map.put("appId", wecartPayReturn.getAppid());
map.put("timeStamp", timestamp);
map.put("nonceStr", wecartPayReturn.getNonce_str());
map.put("package", "prepay_id="+wecartPayReturn.getPrepay_id());
map.put("signType", "MD5");
//签名生成
String prepay_id= resp.get("prepay_id");
String stringA =""+"appId="+config.getAppID()+"&nonceStr="+resp.get("nonce_str") +"&package=prepay_id="+prepay_id+"&signType=MD5"+"&timeStamp=" + timestamp + "&key="+config.getKey();
String paySign=WXPayUtil.MD5(stringA).toUpperCase();
//String paySign = WXPayUtil.generateSignature(map, config.getKey(),SignType.MD5);
wecartPayReturn.setSign(paySign);
wecartPayReturn.setTimestamp(timestamp);
}
log.info("wwwwwwwwwwwwwwwwwwww订单:" + toPayForm.getOut_trade_no() + "完成获取微信链接wwwwwwwwwwwwwwwwwwww");
return CallBack.success(wecartPayReturn);
} catch (Exception e) {
log.error("wwwwwwwwwwwwwwwwwwww订单:" + toPayForm.getOut_trade_no() + "获取微信链接失败wwwwwwwwwwwwwwwwwwww");
log.error(e.getMessage());
return CallBack.fail();
}
}
/**
* 价格单位 为元 换算为分
* @param price
* @return
* @author lpf
* @date: 2019年2月18日 上午11:04:19
*/
private String wechartPrice(String price){
BigDecimal tempDataBig = new BigDecimal(price);
// 元换算为 分
String result = tempDataBig.multiply(new BigDecimal(100d)).intValue() + "";
return result;
}
/**
* 支付功能获取订单支付信息
* @param code
* @return
* @author lpf
* @date: 2019年1月18日 下午3:24:08
*/
protected OrderPayVo getOrderPayVo(String code) {
if (StringUtils.isBlank(code)) {
throw new BaseException("PayTypeAdapter#getOrderPayVo 订单编号不能为空");
}
log.info("zzzzzzzz支付功能获取订单支付信息,code:" + code);
CallBack<OrderPayVo> call = payClient.getOrderPayVo(code);
log.info(code + "获取订单支付信息callback:" + call);
if (call != null && call.hasEntity()) {
return call.getData();
}
throw new BaseException("PayTypeAdapter#getOrderPayVo Error,callback:" + call);
}
@ApiOperation("退款 ")
@PostMapping("/refund")
public CallBack<Boolean> refund(RefundForm refundForm){
......
......@@ -11,6 +11,7 @@ import java.util.List;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -21,6 +22,7 @@ import com.zrqx.core.client.form.third.pay.CloseForm;
import com.zrqx.core.client.form.third.pay.RefundForm;
import com.zrqx.core.client.form.third.pay.RefundQueryForm;
import com.zrqx.core.client.form.third.pay.ToPayForm;
import com.zrqx.core.client.third.PayClient;
import com.zrqx.core.client.vo.order.OrderPayVo;
import com.zrqx.core.client.vo.third.pay.payquery.PayQueryReturnVo;
import com.zrqx.core.client.vo.third.pay.refundquery.BaseRefundQueryReturnVo;
......@@ -31,12 +33,15 @@ import com.zrqx.core.client.vo.third.wechart.WecartRefundQueryReturn;
import com.zrqx.core.client.vo.third.wechart.WechartRefundReturn;
import com.zrqx.core.enums.third.pay.PayTypeEnum;
import com.zrqx.core.enums.third.pay.WeChartType;
import com.zrqx.core.exception.BaseException;
import com.zrqx.core.util.datatype.DateUtils;
import com.zrqx.core.util.response.CallBack;
import com.zrqx.third.pay.config.WXPay;
import com.zrqx.third.pay.config.WXPayConfig;
import com.zrqx.third.pay.config.WXPayUtil;
import com.zrqx.third.pay.interfaces.payType.PayTypeAdapter;
import io.swagger.annotations.ApiModelProperty;
/**
* 微信支付的实现
* @author lw
......@@ -50,6 +55,8 @@ public class WeChatPayImpl extends PayTypeAdapter{
@Autowired
private WXPayConfig config;
// 设备号,pc端填写WEB
@Value("${pay.wechatpay.device_info}")
private String device_info;
......@@ -163,6 +170,8 @@ public class WeChatPayImpl extends PayTypeAdapter{
return CallBack.fail();
}
}
/**
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论