Commit 1203dd4c by Java-聂换换

提现

parent 5b37019a
......@@ -151,4 +151,26 @@ public class ComCode {
public static final String PAYCHANNEL_HL2 = "quick_jfen";
public static final String PAYCHANNEL_HL3 = "quick_integral";
public static final String PAYCHANNEL_HUANQIUHUIJU = "quick_huanqiuhuiju";
/**
* 支付方式
*/
public static final String PAYMETHOD_QUICK = "quick";
public static final String PAYMETHOD_WX = "wx";
public static final String PAYMETHOD_ALI = "ali";
public static final String PAYMETHOD_PUTFORWARD = "put_forward";
/**
* 平安银行
*/
public static final String PINGANBANK_ENTERPRISECODE = Global.getConfig("pinganbank.enterprisecode");// 企业代码
public static final String PINGANBANK_ACCOUNT = Global.getConfig("pinganbank.account"); // 企业账号
public static final String PINGANBANK_OUTACCTNO = Global.getConfig("pinganbank.outacctno"); // 企业的付款人账号
public static final String PINGANBANK_OUTACCTNAME = Global.getConfig("pinganbank.outacctname"); // 企业的付款人账号
public static final String PINGANBANK_OUTACCTBANK = Global.getConfig("pinganbank.outacctbank"); // 企业银行代码
public static final String PINGANBANK_B2BICURL = Global.getConfig("pinganbank.b2bicurl"); // 企业银行代码
}
......@@ -239,6 +239,21 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
}
/**
* 获取自定义昨天日期
* @param month 月份
* @return Date
*/
public static String getDateByDay ( String pattern,int day ) {
SimpleDateFormat dateFormat = new SimpleDateFormat ( pattern);
Calendar calendar = Calendar.getInstance ( );
Date date = new Date();
calendar.setTime ( date );
calendar.add ( Calendar.DATE , day );
return dateFormat.format ( calendar.getTime ( ) );
}
/**
* 获取当月第一天
*
* @param yyyy-mm-dd
......
......@@ -151,6 +151,27 @@ public class PayApiController {
return resp;
}
/**
* 提现
*
* @param request
* @return
*/
@PostMapping("/putForward")
public Response putForward(JuHeZhongPayRequest request) {
Response resp = new Response();
try {
return payService.putForward(request);
}catch (Exception e){
resp.setMessage(ComCode.STATUS_CODE_9998_DESC);
resp.setStatus(ComCode.STATUS_CODE_9998);
resp.setError(e.getMessage());
}
return resp;
}
/**
* juhezhong快捷支付的回调
* @param request
......
package com.thinkgem.jeesite.modules.pay.pinganbank.dto;
public class PingAnBankDto {
private String account; // 账号
private String ccyCode;// 货币类型 RMB 人民币,USD 美元,HKD 港币, 默认为RMB
private String ccyType;// 钞汇标志 C 钞户, R汇户,默认为C。
private String enterprisecode;
private String orderCode;
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getCcyCode() {
return ccyCode;
}
public void setCcyCode(String ccyCode) {
this.ccyCode = ccyCode;
}
public String getCcyType() {
return ccyType;
}
public void setCcyType(String ccyType) {
this.ccyType = ccyType;
}
public String getEnterprisecode() {
return enterprisecode;
}
public void setEnterprisecode(String enterprisecode) {
this.enterprisecode = enterprisecode;
}
public String getOrderCode() {
return orderCode;
}
public void setOrderCode(String orderCode) {
this.orderCode = orderCode;
}
}
package com.thinkgem.jeesite.modules.pay.pinganbank.util;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.thinkgem.jeesite.common.constant.ComCode;
import com.thinkgem.jeesite.common.utils.DateUtils;
import com.thinkgem.jeesite.common.utils.IdGen;
import com.thinkgem.jeesite.common.utils.StringUtils;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.jdom2.JDOMException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Date;
public class PingAnBankUtils {
public static String getBobyLength(String boby) throws UnsupportedEncodingException {
String length = boby.getBytes("GBK").length+"";
int sub = 10-length.length() ;
StringBuffer sb = new StringBuffer();
for(int i=0;i<sub;i++){
sb.append("0");
}
sb.append(length);
return sb.toString();
}
public static String getHead(String boby,String enterprisecode,String transactionCode,String orderCode) throws UnsupportedEncodingException {
StringBuffer sb = new StringBuffer();
sb.append("A001010102")
.append(enterprisecode)
.append(PingAnBankUtils.getBobyLength(boby))
.append(transactionCode)
.append(" ")
.append("0000001")
.append(DateUtils.formatDate(new Date(),"yyyymmddhhmmss"));// 时间
if(StringUtils.isBlank(orderCode)){
orderCode = IdGen.randomBase62(20);
}
sb.append(orderCode)// 交易码
.append("000000")//返回码 请求时必须填写 000000 非“000000”代表交易受理异常或失败
.append("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000RSA-SHA100000000000")
.append(boby.toString());
System.out.println(sb.toString());
return sb.toString();
}
public static JSONObject post(String parma) throws IOException, JDOMException {
// 目前是本地的服务 等服务器好了之后
PostMethod postMethod = new PostMethod(
ComCode.PINGANBANK_B2BICURL);
postMethod.setRequestEntity(new StringRequestEntity(
parma, "text/html", "GBK"));
postMethod.setRequestHeader("Content-Type",
"text/xml; charset=GBK");
HttpClient httpClient = new HttpClient();
int resultint = httpClient.executeMethod(postMethod);
System.out.println(postMethod.getResponseBody());
String res = new String(postMethod.getResponseBody(),"GBK");
System.out.println("http response:" + res);
postMethod.releaseConnection();
System.out.println(resultint);
if(res.contains("<")){
System.out.println(res.substring(res.indexOf("<")));
JSONObject json= XmlUtil.xml2JSON(res.substring(res.indexOf("<")).getBytes());
System.out.println(json.toJSONString());
return json;
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("all",res);
return jsonObject;
}
}
package com.thinkgem.jeesite.modules.pay.pinganbank.util;
import com.alibaba.fastjson.JSONObject;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;
public class XmlUtil {
public static JSONObject xml2JSON(byte[] xml) throws JDOMException, IOException {
JSONObject json = new JSONObject();
InputStream is = new ByteArrayInputStream(xml);
SAXBuilder sb = new SAXBuilder();
org.jdom2.Document doc = sb.build(is);
Element root = doc.getRootElement();
json.put(root.getName(), iterateElement(root));
return json;
}
private static JSONObject iterateElement(Element element) {
List node = element.getChildren();
Element et = null;
JSONObject obj = new JSONObject();
List list = null;
for (int i = 0; i < node.size(); i++) {
list = new LinkedList();
et = (Element) node.get(i);
if (et.getTextTrim().equals("")) {
if (et.getChildren().size() == 0)
continue;
if (obj.containsKey(et.getName())) {
list = (List) obj.get(et.getName());
}
list.add(iterateElement(et));
obj.put(et.getName(), list);
} else {
if (obj.containsKey(et.getName())) {
list = (List) obj.get(et.getName());
}
list.add(et.getTextTrim());
obj.put(et.getName(), list);
}
}
return obj;
}
/**
* JsonObject转换成xml
*
* @param json
* @return
*/
public static String JsonBean2XmlString(JSONObject json){
System.out.println("JsonBean转换成xml:");
System.out.println("json:"+json);
StringBuffer sb = new StringBuffer("<?xml version=\"1.0\" encoding=\"GBK\"?><Result>");
for(Object key : json.keySet()){
sb.append("<").append(key).append(">");
Object value = json.get(key);
//判断value是否含有JSONArray
try {
JSONObject jsonV = ((JSONObject)value);
for(Object key2 : jsonV.keySet()){
sb.append("<").append(key2).append(">");
Object value2 = jsonV.get(key2);
sb.append(value2);
sb.append("</").append(key2).append(">");
}
}catch (Exception e){
sb.append(value);
}
sb.append("</").append(key).append(">");
}
sb.append("</Result>");
return sb.toString();
}
public static void main(String[] args) throws JDOMException, IOException {
String xml="<?xml version=\"1.0\" encoding=\"utf-8\" ?><MoBaoAccount MessageType=\"UserMobilePay\" PlatformID=\"b2ctest\"><OrderNo>M20150521084825</OrderNo><TradeAmt>5000.00</TradeAmt><Commission>0.5</Commission><UserID>zhuxiaolong</UserID><MerchID>zhuxiaolong1</MerchID><tradeType>0</tradeType><CustParam>123</CustParam> <NotifyUrl>http://mobaopay.com/callback.do</NotifyUrl><TradeSummary>订单</TradeSummary></MoBaoAccount>";
JSONObject json=xml2JSON(xml.getBytes());
System.out.println(json.toJSONString());
System.out.println(JsonBean2XmlString(json));
}
}
......@@ -8,6 +8,7 @@ import com.thinkgem.jeesite.common.config.Global;
import com.thinkgem.jeesite.common.constant.ComCode;
import com.thinkgem.jeesite.common.utils.DateUtils;
import com.thinkgem.jeesite.common.utils.IdGen;
import com.thinkgem.jeesite.common.utils.StringUtils;
import com.thinkgem.jeesite.modules.commonError.MyException;
import com.thinkgem.jeesite.modules.pay.alipay.service.AlipayService;
import com.thinkgem.jeesite.modules.pay.dao.PayApiDao;
......@@ -24,6 +25,8 @@ import com.thinkgem.jeesite.modules.pay.juhezhong.service.JuHeZhongPayIntegralSe
import com.thinkgem.jeesite.modules.pay.juhezhong.service.JuHeZhongPayJFenService;
import com.thinkgem.jeesite.modules.pay.juhezhong.service.JuHeZhongPayService;
import com.thinkgem.jeesite.modules.pay.juhezhong.utils.MakeOrderNum;
import com.thinkgem.jeesite.modules.pay.pinganbank.PingAnBankService;
import com.thinkgem.jeesite.modules.pay.pinganbank.dto.PingAnBankDto;
import com.thinkgem.jeesite.modules.sys.entity.Dict;
import com.thinkgem.jeesite.modules.sys.service.SystemService;
import com.thinkgem.jeesite.modules.sys.utils.DictUtils;
......@@ -71,6 +74,9 @@ public class PayApiService {
@Autowired
private AlipayService alipayService;
@Autowired
private PingAnBankService pingAnBankService;
/**
* 快捷支付(分为不同的渠道)
......@@ -841,6 +847,73 @@ public class PayApiService {
/**
* 提现
* @param request
* @return
* @throws AlipayApiException
*/
@Transactional(readOnly = false)
public Response putForward(JuHeZhongPayRequest request) throws Exception {
// 1. 根据入参获取用户详情信息,包括支付卡片信息
UserEntity userEntity = userService.getUserInfo(new Request(request.getSubMerchantCode()));
userEntity = userService.getUserDetailInfo(userEntity);
CardEntity cardEntity = userService.getCardInfo(request);
// 2. 创建支付订单信息,并保存
String code = IdGen.randomBase62(64);
String payNo = ComCode.YYYYMMDDHHMM.format(new Date()) + IdGen.randomBase62(8); // 订单号
String payCode = IdGen.randomBase62(20);
OrderEntity orderEntity = new OrderEntity(code, request.getSubMerchantCode(), payNo, payCode,ComCode.PAYMETHOD_PUTFORWARD, ComCode.PAYMETHOD_PUTFORWARD, "1",request.getAmount() , "提现", "","0", request.getCardCode());
payDao.saveOrderInfo(orderEntity);
// 平安银行转账
PingAnBankDto dto = new PingAnBankDto();
dto.setOrderCode(payCode);
dto.setEnterprisecode(ComCode.PINGANBANK_ENTERPRISECODE);
// dto.setEnterprisecode("00103082100008003000");
JSONObject jsonObject = new JSONObject();
jsonObject.put("ThirdVoucher",payCode); // 转账凭证号 标示交易唯一性,同一客户上送的不可重复,建议格式:yyyymmddHHSS+8位系列
jsonObject.put("CcyCode","RMB"); // 货币类型 RMB-人民币
jsonObject.put("OutAcctNo",ComCode.PINGANBANK_OUTACCTNO); // 付款人账户 扣款账户
jsonObject.put("OutAcctName",ComCode.PINGANBANK_OUTACCTNAME); // 付款人名称 付款账户户名
jsonObject.put("OutAcctAddr","34343"); // 付款人地址 建议填写付款账户的分行、网点名称 非必输
jsonObject.put("InAcctBankNode",cardEntity.getBelongBank()); // 收款人开户行行号 跨行转账建议必输。为人行登记在册的商业银行号
jsonObject.put("InAcctNo",cardEntity.getCardNo()); // 收款人账户
jsonObject.put("InAcctName",userEntity.getUserDetail().getRealName()); // 收款人账户户名
jsonObject.put("InAcctBankName",cardEntity.getBankName()); // 收款人开户行名称
jsonObject.put("TranAmount",request.getAmount()); // 转出金额 如为XML报文,则直接输入输出以元为单位的浮点数值,如2.50 (两元五角)
jsonObject.put("UseEx","ZZZZZtestreturn"); // 资金用途 30个汉字。现金管理代理结算 非必输
jsonObject.put("UnionFlag",cardEntity.getBelongBank().equals(ComCode.PINGANBANK_OUTACCTBANK)?1:0); // 行内跨行标志 1:行内转账,0:跨行转账
jsonObject.put("SysFlag","1"); // Y:加急 N:普通S:特急默认为N
jsonObject.put("AddrFlag","1"); // 同城/异地标志 “1”—同城 “2”—异地;若无法区分,可默认送1-同城。
JSONObject result = pingAnBankService.singleTransfer(dto,jsonObject);
Response response = new Response();
if(result.get("all") !=null){
String str = result.getString("all");
String reg = "[^\u4e00-\u9fa5]";
str = str.replaceAll(reg, " ");
str = str.trim();
System.out.println(str);
response.setMessage(str);
response.setStatus(ComCode.STATUS_CODE_9998);
return response;
}
// response.setMessage(str);
response.setStatus(ComCode.STATUS_CODE_2000);
return response;
}
/**
* 回调
* @param orderEntity
* @return
......@@ -957,11 +1030,14 @@ public class PayApiService {
return payDao.getOrder(orderEntity);
}
/**
* 交易超过7天则修改为交易失败
*/
@Transactional(readOnly = false)
public void updateOrderTiming(){
// System.out.println("。。。。。。。定时任务。updateOrderTiming开始。。。。");
OrderEntity orderEntity = new OrderEntity();
orderEntity.setEndTime(DateUtils.getYesterday(DateUtils.getYesterday("yyyy-MM-dd HH:mm:ss")));
orderEntity.setEndTime(DateUtils.getDateByDay("yyyy-MM-dd HH:mm:ss",-7));
List<OrderEntity> list = payDao.getOrderListTimeing(orderEntity);
for(OrderEntity order:list){
order.setPayStatus("3");
......@@ -973,15 +1049,21 @@ public class PayApiService {
// System.out.println("。。。。。。。定时任务。updateOrderTiming结束。。。。");
}
/*
* 查询交易的状态并修改
*/
@Transactional(readOnly = false)
public void updateOrders(){
// System.out.println("。。。。。。。定时任务。updateOrders开始。。。。");
try {
OrderEntity orderEntity = new OrderEntity();
orderEntity.setStartTime(DateUtils.getYesterday(DateUtils.getYesterday("yyyy-MM-dd HH:mm:ss")));
orderEntity.setStartTime(DateUtils.getDateByDay("yyyy-MM-dd HH:mm:ss",-7));
orderEntity.setEndTime(DateUtils.formatDate(DateUtils.addHours(new Date(),-12),"yyyy-MM-dd HH:mm:ss"));
List<OrderEntity> list = payDao.getOrderListTimeing(orderEntity);
for(OrderEntity order:list){
// 快捷支付
if("quick".equals(order.getPayMethod())){
QuickDto dto = new QuickDto();
dto.setOrderId(order.getPayCode());
......@@ -1012,11 +1094,36 @@ public class PayApiService {
payDao.deleteBenefit(benefitEntity);
}
}
}else if("put_forward".equals(order.getPayMethod())){ // 提现
// 查询单笔转账
PingAnBankDto dto = new PingAnBankDto();
dto.setOrderCode(IdGen.randomBase62(20));
dto.setEnterprisecode(ComCode.PINGANBANK_ENTERPRISECODE);
JSONObject jsonObject = new JSONObject();
jsonObject.put("OrigThirdVoucher",order.getPayCode()); // 转账凭证号 推荐使用;使用4004接口上送的ThirdVoucher或者4014上送的SThirdVoucher
JSONObject jsonObject1 = pingAnBankService.querySingleTransfer(dto,jsonObject);
if("20".equals(jsonObject1.getString("Stt"))){// 交易成功
order.setPayStatus("2");
payDao.updateOrderStatus(order);
// 添加提现记录
String benefitCode = IdGen.randomBase62(64);
BenefitEntity benefitEntity = new BenefitEntity(benefitCode, order.getUserCode(), order.getPayCode(), order.getPayChannel(), "0", "M", order.getAmount(), order.getCardCode());
// benefitEntity.setAmount(String.valueOf(Double.valueOf(benefitEntity.getAmount())));
benefitEntity.setPayMethod(orderEntity.getPayMethod());
payDao.saveBenefitInfo(benefitEntity);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
// System.out.println("。。。。。。。定时任务。updateOrders结束。。。。");
}
}
......@@ -108,7 +108,8 @@
<select id="findDictListPayChannel" resultType="com.thinkgem.jeesite.modules.sys.entity.DictPayChannel">
SELECT
value,
label
label,
remarks
FROM sys_dict
WHERE del_flag = #{DEL_FLAG_NORMAL}
<if test="type != null and type != ''">
......
......@@ -829,9 +829,11 @@
yc.create_by AS createdUser,
yc.update_date AS modified,
yc.update_by AS modifiedUser,
yc.del_flag AS delFlag
yc.del_flag AS delFlag,
yb.bank_name AS bankName
FROM
youka_cards yc
LEFT JOIN youka_bank yb ON yb.bank_code = yc.belong_bank
WHERE
yc.card_no = #{cardNo}
</select>
......
......@@ -148,3 +148,25 @@ weixin.appsecret = libo13821934497libo1382193449700
alipay.appid = 2018041002530242
alipay.private.key = MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC3hFTccWmIFkIQzitDdGTgWKgbs1S2NZutDlUCdiWrXSV+aAvQDqpLXJb7CQ1iSY3CJ4rPbBs7GFZj1rZ1T722Xj1QiFJRTgSSaUe9gejDFOIBpyoG0gT7gZsFrdcYHCzJcA3L9LUWt9XLLH34couARVGY8FUa1GXVUierMms4JnJ1I+Eos4jBmTpLFpZb6brsfuGOzk501KWk+mVXhdEf47MoT6i0ujebf22rdWqQz4ukS7eRbRfvoh0g5wEt14NQHXFLgSAqPN+ZDpKQ8H9Cz0Mj37iN0SA31j3S/Cl0zyPL9n+bWSJdE2MDge8nC7joR4Nxbqirlp3qJ7YOtMghAgMBAAECggEAXG9JFygA0cz0Reayn+1WijHdquYu+wARg58+blj4LFJkekEKAigA2qiuW495sFIAFxU3s7ZuGNvvV6ZkjL43fk4FcDTZ0Z4Ma3qf6fIvPWOdWtvKLVlHrS7g2IFxX/GBFY1dRafiNqkuBIJKiQOZBGjl6rTTCQqGqGYTGQXyP3syu72Nc1p7cq2a4H4Ux+vAC0OxYuCeL12wR5qf1PJ0O+h/syr7+WY7sez5ae36e82C6iQfl3RNqAQyuiqADhUFa/IoKhb1IklddKZZkiU0wsNeLsqkklNSXgejlPKom5MLyRloSyEqARvXBTfAXPn0IkQ9eYNLh1k2MOh5SfqKyQKBgQDum0+irr4T0gpYJ51YzJIjEBn5bUOo0Q0vYb0jRQ0y0lfmAqSTV4RdlasMf8Ny3DZvO1C4nTQ0/Mv2HDJTtLUAC/VntEiKdgS0Dj0iyqTqWXYtTsA1zKr+7RgjPdOC3P7y6lbV+xfmnjHKGFIGKPaxeNVQe72bbLrg5QTMYw0A1wKBgQDE5PqXl6lvEFbNDyHIXOnfXyox1Q881fTZKavKOel6kGP1Qn82BrEC/BF+8ZkGCe/HHuzuFPcw7sInV13xBEVOegcHximXmiR5S8j/SfkTFtrKttMkaZPoW64RrNNsnPckhLTymTefpXX4JQj/ZkNtfg3VO2O9VKkJy74X417HxwKBgBPNYfOPawj8Eo20Y/OdrrcoO++eaNIW33BCPU8zCOBh4pedOolb5wlZRYPZCqB6tC3RD2by7QVEwaygNHEL+0WQuIItzSNongVPdTVw+fTVDeC+u2b7oGldxfYOyIIA00vXtPM3Tol+MYWjNRN7zNV3wMRYMKk4gd3uQ9KumcKrAoGBAIDbAgz3mlEvNj9ZKdjAxeYDl8+pCiHcPDNrDBx6rgwiNuiprisjUfEMGj8jyeuj0SJVYOWnHucNOk8Y5Ef5bYogXj1+OHYY0Mn5CP/Z34HYsTN9Vs07syqb5V13553rU+q4Vtt13mtCk+PkCPFscbBUkKT+CxY7M61Pg4aKrNq9AoGATMAwhGqTdcXvBb1XV5ScbP+UIkqLbib8eYDJRIMlCGGqDMbOoBQQ9joJFtZjV2sL0QwF7qaxtjLs+VVnZkVYHRtn25frtb7teLRuJB7rW9905zqGtCx730uSCX8PuyPS98cV0KnuVCIZZMQbLNVb2M/u/ENJYqSVAETy+xAs7hQ=
alipay.public.key = MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAg3CAeybKvbk7slUC6wCZiqGKgZwwcL4vvlztKO52xqTnHcsxhC+ogrtg5x59+3T4fKqOs38vC8faEbGbCUqr68hrjXkE0ZuPWygrp3jTUC9vkw+d+Fk18xsoRqac3b7OeNVLbCN9Nq2rAzVqLrNeQFWjpZbXFpPcvSLH3rv4U3ljhjvFnEGOpxu8vdpc/AGwZ+R2GX3yH1W85iWcO3GAEC3raTRq3RRgsKC3WZTq85Vxl70K0FfLKDjNTOQVnEwfYS9wTl4zDTBObxAfQEdH03fXJTkpLwAKlsiJiPRsfyoJMFA6nVCfKhjJwXia99MT1kGHVRyPu/JpaXepme2orwIDAQAB
## 平安银行相关
## 企业代码
pinganbank.enterprisecode = 00202043000000326000
## 企业账号
pinganbank.account = 15000092480851
## 企业的付款人账号
pinganbank.outacctno = 15000092480851
## 企业的付款人姓名
pinganbank.outacctname = 天津盛世互通网络科技有限公司
## 企业银行代码
pinganbank.outacctbank = 307110004315
## 企业银行代码
pinganbank.b2bicurl = http://39.107.124.166:7072
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment