Commit 1ce79af3 by chongli

Merge branch 'miniAppPay' into f-6.6.9

parents 29cd6d54 05f0fd75
Showing with 915 additions and 735 deletions
......@@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.alibaba.fastjson.JSONObject;
import com.ctrip.fun.common.vo.PagedResponseBean;
import com.ctrip.fun.common.vo.Request;
import com.ctrip.fun.common.vo.Response;
......@@ -37,6 +38,21 @@ public abstract class AbstractOrderController<H extends AbstractOrderBean<T>, T,
return response;
}
@SuppressWarnings("unchecked")
@ResponseBody
@RequestMapping(value = "/placeOrderWeiXinPay", method = RequestMethod.POST)
public Response<JSONObject> placeOrderWeiXinPay(@RequestBody Request<H> request) {
Response<JSONObject> response = new Response<JSONObject>();
try {
response = this.getOrderService().placeOrderWeiXinPay(request.getBody());
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
@SuppressWarnings("unchecked")
@ResponseBody
@RequestMapping(value = "/callback", method = RequestMethod.POST)
......
......@@ -43,6 +43,22 @@ public class CommuneOrderController extends AbstractOrderController<CommuneOrder
return response;
}
@SuppressWarnings("unchecked")
@ResponseBody
@RequestMapping(value = "/voucherPlaceOrderForMiniApp", method = RequestMethod.POST)
public Response<JSONObject> voucherPlaceOrderForMiniApp(@RequestBody Request<CommuneOrderBean> request) {
Response<JSONObject> response = new Response<JSONObject>();
JSONObject jSONObject;
try {
jSONObject = communeOrderService.voucherPlaceOrderForMiniApp(request.getBody());
response.setBody(jSONObject);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
@Override
protected AbstractOrderService<CommuneOrderBean, CommuneOrderResourceBean> getOrderService() {
return communeOrderService;
......
......@@ -12,9 +12,11 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.alibaba.fastjson.JSONObject;
import com.ctrip.fun.common.vo.Request;
import com.ctrip.fun.common.vo.Response;
import com.ctrip.fun.common.vo.ResponseStatusEnum;
import com.ctrip.fun.common.vo.order.CommuneOrderBean;
import com.ctrip.fun.common.vo.order.EventActivityOrderBean;
import com.ctrip.fun.common.vo.order.EventActivityOrderListItemBean;
import com.ctrip.fun.common.vo.order.EventActivityOrderResourceBean;
......
......@@ -32,4 +32,16 @@ public abstract class AbstractNotifyController {
return notifyResponseBean;
}
/**
* 支付通知
*
* @param createPayOrderRequestBean CreatePayOrderRequestBean
* @throws Exception
*/
@ResponseBody
@RequestMapping(value = "/notifyForWeiXinPay", method = RequestMethod.POST)
public String notify(@RequestBody String xml) throws Exception {
return this.getNotifyService().notifyForWeiXinPay(xml);
}
}
......@@ -39,4 +39,18 @@ public class CommuneOrderNotifyController extends AbstractNotifyController {
return communeNotifyService.notifyForMiniApp(xml);
}
/**
* 支付通知
*
* @param createPayOrderRequestBean CreatePayOrderRequestBean
* @throws Exception
*/
@ResponseBody
@RequestMapping(value = "/notifyForVoucherMiniApp", method = RequestMethod.POST)
public String notifyForVoucherMiniApp(@RequestBody String xml) throws Exception {
return communeNotifyService.notifyForVoucherMiniApp(xml);
}
}
......@@ -855,7 +855,7 @@ public class VoucherDao extends GenericHibernateDao<Voucher, Integer> {
public PagedResponseBean<VoucherItemDTO> queryListForMiniApps(VoucherQueryDto queryBean) {
StringBuilder sb = new StringBuilder(
"select SQL_CALC_FOUND_ROWS v.Id AS id,v.Type AS type,v.Amount AS amount,v.StartUseDate AS startUseDate,v.EndUseDate AS endUseDate,v.Used AS used,v.UseDate AS useDate,rule.remark AS remark,rule.description AS description,v.UID AS uid,v.Source AS source,v.ruleId AS ruleId,v.shared,v.isShare from bsc_voucher v LEFT JOIN bsc_voucher_rule rule on (v.ruleId=rule.id) where 1=1 ");
"select SQL_CALC_FOUND_ROWS v.Id AS id,v.Type AS type,v.Amount AS amount,v.StartUseDate AS startUseDate,v.EndUseDate AS endUseDate,v.Used AS used,v.UseDate AS useDate,rule.remark AS remark,rule.description AS description,v.UID AS uid,v.Source AS source,v.ruleId AS ruleId,v.shared,v.isShare,v.userLimit from bsc_voucher v LEFT JOIN bsc_voucher_rule rule on (v.ruleId=rule.id) where 1=1 ");
if (queryBean.getUsed() != null) {
if(queryBean.getUsed()==0){
sb.append("and Used=0 ");
......@@ -916,7 +916,7 @@ public class VoucherDao extends GenericHibernateDao<Voucher, Integer> {
}
public List<VoucherItemDTO> queryListByIdsForMiniApps(String ids) {
StringBuilder sb = new StringBuilder("select SQL_CALC_FOUND_ROWS v.Id AS id,v.Type AS type,v.Amount AS amount,v.StartUseDate AS startUseDate,v.EndUseDate AS endUseDate,v.Used AS used,v.UseDate AS useDate,rule.remark AS remark,rule.description AS description,v.UID AS uid,v.Source AS source,v.ruleId AS ruleId,v.shared,v.isShare from bsc_voucher v LEFT JOIN bsc_voucher_rule rule on (v.ruleId=rule.id) where 1=1 ");
StringBuilder sb = new StringBuilder("select SQL_CALC_FOUND_ROWS v.Id AS id,v.Type AS type,v.Amount AS amount,v.StartUseDate AS startUseDate,v.EndUseDate AS endUseDate,v.Used AS used,v.UseDate AS useDate,rule.remark AS remark,rule.description AS description,v.UID AS uid,v.Source AS source,v.ruleId AS ruleId,v.shared,v.isShare,v.userLimit from bsc_voucher v LEFT JOIN bsc_voucher_rule rule on (v.ruleId=rule.id) where 1=1 ");
sb.append(" and v.id in(").append(ids).append(")");
Session session = this.getSession();
Query query = session.createSQLQuery(sb.toString());
......
......@@ -1769,7 +1769,9 @@ public class OrderDao extends GenericHibernateDao<Order, Integer> {
@SuppressWarnings("unchecked")
public PagedEntityBean<EventActivityOrderListItemBean> queryEventActivityOrders(OrderQuery queryBean) {
PagedEntityBean<EventActivityOrderListItemBean> pagedEntityBean = new PagedEntityBean<EventActivityOrderListItemBean>();
String sel = "select SQL_CALC_FOUND_ROWS a.OrderID ,a.confirmType ,a.isThird, a.OrderType , a.TempOrderNo , a.OrderNo , DATE_FORMAT(a.OrderDate, '%Y-%m-%d %H:%i:%s') as OrderDate , a.OrderName , a.ProcessStatus , a.OrderUserStatus , a.PayMode ,b.resourceId, b.CourseProductID , b.ProductName , DATE_FORMAT(b.PlayDate, '%Y-%m-%d %H:%i:%s') as PlayDate , b.startTime , a.Uid , a.Amount , a.TotalAmount , a.Remark ,b.teeTime from ord_order a inner JOIN ORD_EventActivityOrderItem b on a.OrderID=b.OrderID where 1=1 and a.`enable` = true ";
String cond = "";
if (null != queryBean.getUid() && !"".equals(queryBean.getUid())) {
......@@ -1781,7 +1783,7 @@ public class OrderDao extends GenericHibernateDao<Order, Integer> {
if(queryBean.getOrderStatusToUser()!=null){
if(queryBean.getOrderStatusToUser()==1){
cond += " and (a.orderType=0 and a.processStatus & (268435520)=0)";
cond += " and ((a.orderType=0 and a.processStatus & 268435520=0) or (a.payMode IN ('P', 'M', 'G') AND a.orderType = 1 AND a.processStatus & 310381820 = 4))";
}else if(queryBean.getOrderStatusToUser()==2){
cond += " and ((a.payMode IN ('P', 'M', 'G') AND a.orderType = 1 AND (a.processStatus & 303198715 = 16 OR a.processStatus & 303198715 = 4496 OR a.processStatus & 303198715 = 4368)) or (a.payMode IN ('P', 'M', 'G') AND a.orderType = 1 AND a.processStatus & 310394835 = 19))";
}else if(queryBean.getOrderStatusToUser()==3){
......
......@@ -55,8 +55,12 @@ public class Voucher implements java.io.Serializable {
//是否可分享
private int shared;
//是否分享了
private int isShare;
//领券人限制:不限制,vpi,社员,社员并且vip
private int userLimit;//0,2,4,6
public Voucher() {
}
......@@ -263,6 +267,15 @@ public class Voucher implements java.io.Serializable {
this.shared = shared;
}
@Column(name = "userLimit")
public int getUserLimit() {
return userLimit;
}
public void setUserLimit(int userLimit) {
this.userLimit = userLimit;
}
@Column(name = "sourceRemark")
public String getSourceRemark() {
return sourceRemark;
......
......@@ -132,6 +132,11 @@ public class VoucherRule {
*/
private int shared;
/**
* 分享获取券的用户的等级性质
*/
private int userLimit;
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
......@@ -337,6 +342,15 @@ public class VoucherRule {
this.shared = shared;
}
@Column(name = "userLimit")
public int getUserLimit() {
return userLimit;
}
public void setUserLimit(int userLimit) {
this.userLimit = userLimit;
}
}
package com.ctrip.fun.golf.domain.payment;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import javax.net.ssl.SSLContext;
import javax.net.ssl.X509TrustManager;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;
public class HttpRequest {
//连接超时时间,默认10秒
private static final int socketTimeout = 10000;
//传输超时时间,默认30秒
private static final int connectTimeout = 30000;
/**
* post请求
* @throws IOException
* @throws ClientProtocolException
* @throws NoSuchAlgorithmException
* @throws KeyStoreException
* @throws KeyManagementException
* @throws UnrecoverableKeyException
*/
public static String sendPost(String url, Object xmlObj) throws ClientProtocolException, IOException, UnrecoverableKeyException, KeyManagementException, KeyStoreException, NoSuchAlgorithmException {
HttpPost httpPost = new HttpPost(url);
//解决XStream对出现双下划线的bug
XStream xStreamForRequestPostData = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_")));
xStreamForRequestPostData.alias("xml", xmlObj.getClass());
//将要提交给API的数据对象转换成XML格式数据Post给API
String postDataXML = xStreamForRequestPostData.toXML(xmlObj);
//得指明使用UTF-8编码,否则到API服务器XML的中文不能被成功识别
StringEntity postEntity = new StringEntity(postDataXML, "UTF-8");
httpPost.addHeader("Content-Type", "text/xml");
httpPost.setEntity(postEntity);
//设置请求器的配置
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build();
httpPost.setConfig(requestConfig);
HttpClient httpClient = HttpClients.createDefault();
HttpResponse response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity, "UTF-8");
return result;
}
/**
* 自定义证书管理器,信任所有证书
* @author pc
*
*/
public static class MyX509TrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] arg0, String arg1)
throws java.security.cert.CertificateException {
// TODO Auto-generated method stub
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] arg0, String arg1)
throws java.security.cert.CertificateException {
// TODO Auto-generated method stub
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
// TODO Auto-generated method stub
return null;
}
}
}
package com.ctrip.fun.golf.domain.payment;
/**
* 预订单
*
* @author zuoliangzhu
*
*/
public class OrderInfo {
private String appid;// 小程序ID
private String mch_id;// 商户号
private String nonce_str;// 随机字符串
private String sign_type;//签名类型
private String sign;// 签名
private String body;// 商品描述
private String out_trade_no;// 商户订单号
private int total_fee;// 标价金额 ,单位为分
private String spbill_create_ip;// 终端IP
private String notify_url;// 通知地址
private String trade_type;// 交易类型
private String openid;//用户标识
public String getSign_type() {
return sign_type;
}
public void setSign_type(String sign_type) {
this.sign_type = sign_type;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public String getAppid() {
return appid;
}
public void setAppid(String appid) {
this.appid = appid;
}
public String getMch_id() {
return mch_id;
}
public void setMch_id(String mch_id) {
this.mch_id = mch_id;
}
public String getNonce_str() {
return nonce_str;
}
public void setNonce_str(String nonce_str) {
this.nonce_str = nonce_str;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getOut_trade_no() {
return out_trade_no;
}
public void setOut_trade_no(String out_trade_no) {
this.out_trade_no = out_trade_no;
}
public int getTotal_fee() {
return total_fee;
}
public void setTotal_fee(int total_fee) {
this.total_fee = total_fee;
}
public String getSpbill_create_ip() {
return spbill_create_ip;
}
public void setSpbill_create_ip(String spbill_create_ip) {
this.spbill_create_ip = spbill_create_ip;
}
public String getNotify_url() {
return notify_url;
}
public void setNotify_url(String notify_url) {
this.notify_url = notify_url;
}
public String getTrade_type() {
return trade_type;
}
public void setTrade_type(String trade_type) {
this.trade_type = trade_type;
}
@Override
public String toString() {
return "OrderInfo [appid=" + appid + ", mch_id=" + mch_id
+ ", nonce_str=" + nonce_str + ", sign_type=" + sign_type
+ ", sign=" + sign + ", body=" + body + ", out_trade_no="
+ out_trade_no + ", total_fee=" + total_fee
+ ", spbill_create_ip=" + spbill_create_ip + ", notify_url="
+ notify_url + ", trade_type=" + trade_type + ", openid="
+ openid + "]";
}
}
package com.ctrip.fun.golf.domain.payment;
public class OrderReturnInfo {
private String return_code;
private String return_msg;
private String result_code;
private String appid;
private String mch_id;
private String nonce_str;
private String sign;
private String prepay_id;
private String trade_type;
public String getReturn_code() {
return return_code;
}
public void setReturn_code(String return_code) {
this.return_code = return_code;
}
public String getReturn_msg() {
return return_msg;
}
public void setReturn_msg(String return_msg) {
this.return_msg = return_msg;
}
public String getResult_code() {
return result_code;
}
public void setResult_code(String result_code) {
this.result_code = result_code;
}
public String getAppid() {
return appid;
}
public void setAppid(String appid) {
this.appid = appid;
}
public String getMch_id() {
return mch_id;
}
public void setMch_id(String mch_id) {
this.mch_id = mch_id;
}
public String getNonce_str() {
return nonce_str;
}
public void setNonce_str(String nonce_str) {
this.nonce_str = nonce_str;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getPrepay_id() {
return prepay_id;
}
public void setPrepay_id(String prepay_id) {
this.prepay_id = prepay_id;
}
public String getTrade_type() {
return trade_type;
}
public void setTrade_type(String trade_type) {
this.trade_type = trade_type;
}
}
package com.ctrip.fun.golf.domain.payment;
import java.util.Random;
/**
* 随机字符串生成
* @author zuoliangzhu
*
*/
public class RandomStringGenerator {
/**
* 获取一定长度的随机字符串
* @param length 指定字符串长度
* @return 一定长度的字符串
*/
public static String getRandomStringByLength(int length) {
String base = "abcdefghijklmnopqrstuvwxyz0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int number = random.nextInt(base.length());
sb.append(base.charAt(number));
}
return sb.toString();
}
}
package com.ctrip.fun.golf.domain.payment;
import com.thoughtworks.xstream.annotations.XStreamAlias;
/**
* 签名信息
* @author zuoliangzhu
*
*/
public class SignInfo {
private String appId;//小程序ID
private String timeStamp;//时间戳
private String nonceStr;//随机串
@XStreamAlias("package")
private String repay_id;
private String signType;//签名方式
public String getAppId() {
return appId;
}
public void setAppId(String appId) {
this.appId = appId;
}
public String getTimeStamp() {
return timeStamp;
}
public void setTimeStamp(String timeStamp) {
this.timeStamp = timeStamp;
}
public String getNonceStr() {
return nonceStr;
}
public void setNonceStr(String nonceStr) {
this.nonceStr = nonceStr;
}
public String getRepay_id() {
return repay_id;
}
public void setRepay_id(String repay_id) {
this.repay_id = repay_id;
}
public String getSignType() {
return signType;
}
public void setSignType(String signType) {
this.signType = signType;
}
}
package com.ctrip.fun.golf.domain.payment;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import com.ctrip.fun.golf.domain.payment.Configure;
import com.thoughtworks.xstream.annotations.XStreamAlias;
/**
* 签名
* @author zuoliangzhu
*
*/
public class Signature {
/**
* 签名算法
* @param o 要参与签名的数据对象
* @return 签名
* @throws IllegalAccessException
*/
public static String getSign(Object o) throws IllegalAccessException {
ArrayList<String> list = new ArrayList<String>();
Class cls = o.getClass();
Field[] fields = cls.getDeclaredFields();
for (Field f : fields) {
f.setAccessible(true);
if (f.get(o) != null && f.get(o) != "") {
String name = f.getName();
XStreamAlias anno = f.getAnnotation(XStreamAlias.class);
if(anno != null)
name = anno.value();
list.add(name + "=" + f.get(o) + "&");
}
}
int size = list.size();
String [] arrayToSort = list.toArray(new String[size]);
Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
StringBuilder sb = new StringBuilder();
for(int i = 0; i < size; i ++) {
sb.append(arrayToSort[i]);
}
String result = sb.toString();
result += "key=" + Configure.getKey();
result = MD5.MD5Encode(result).toUpperCase();
return result;
}
public static String getSign(Map<String,Object> map){
ArrayList<String> list = new ArrayList<String>();
for(Map.Entry<String,Object> entry:map.entrySet()){
if(entry.getValue()!=""){
list.add(entry.getKey() + "=" + entry.getValue() + "&");
}
}
int size = list.size();
String [] arrayToSort = list.toArray(new String[size]);
Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
StringBuilder sb = new StringBuilder();
for(int i = 0; i < size; i ++) {
sb.append(arrayToSort[i]);
}
String result = sb.toString();
result += "key=" + Configure.getKey();
//Util.log("Sign Before MD5:" + result);
result = MD5.MD5Encode(result).toUpperCase();
//Util.log("Sign Result:" + result);
return result;
}
}
package com.ctrip.fun.golf.domain.payment;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.security.KeyStore;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.SortedMap;
import java.util.UUID;
import javax.net.ssl.SSLContext;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
public class WXUtil {
/**
* 随机字符串
* @return
*/
public static String generate() {
return UUID.randomUUID().toString().trim().replaceAll("-", "");
}
/**
* 解析xml,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值是子节点的xml数据。
* @param strxml
* @return
* @throws JDOMException
* @throws IOException
*/
public static Map doXMLParse(String strxml) throws JDOMException, IOException {
strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");
if(null == strxml || "".equals(strxml)) {
return null;
}
Map m = new HashMap();
InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8"));
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(in);
Element root = doc.getRootElement();
List list = root.getChildren();
Iterator it = list.iterator();
while(it.hasNext()) {
Element e = (Element) it.next();
String k = e.getName();
String v = "";
List children = e.getChildren();
if(children.isEmpty()) {
v = e.getTextNormalize();
} else {
v = WXUtil.getChildrenText(children);
}
m.put(k, v);
}
//关闭流
in.close();
return m;
}
/**
* 获取子结点的xml
* @param children
* @return String
*/
private static String getChildrenText(List children) {
StringBuffer sb = new StringBuffer();
if(!children.isEmpty()) {
Iterator it = children.iterator();
while(it.hasNext()) {
Element e = (Element) it.next();
String name = e.getName();
String value = e.getTextNormalize();
List list = e.getChildren();
sb.append("<" + name + ">");
if(!list.isEmpty()) {
sb.append(WXUtil.getChildrenText(list));
}
sb.append(value);
sb.append("</" + name + ">");
}
}
return sb.toString();
}
/**
* 将请求参数转换为xml格式的string字符串,微信服务器接收的是xml格式的字符串
*
* @param parameters
* @return
*/
public static String getRequestXml(SortedMap<Object, Object> parameters) {
StringBuffer sb = new StringBuffer();
sb.append("<xml>");
Set<Entry<Object, Object>> es = parameters.entrySet();
Iterator<Entry<Object, Object>> it = es.iterator();
while (it.hasNext()) {
Map.Entry<Object, Object> entry = (Map.Entry<Object, Object>) it.next();
String k = (String) entry.getKey();
String v = (String) entry.getValue();
if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k) || "sign".equalsIgnoreCase(k)) {
sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">");
} else {
sb.append("<" + k + ">" + v + "</" + k + ">");
}
}
sb.append("</xml>");
return sb.toString();
}
/**
* sign签名,必须使用MD5签名,且编码为UTF-8
* @param characterEncoding
* @param parameters
* @return
*/
public static String createSign_ChooseWXPay(String characterEncoding, SortedMap<Object, Object> parameters, String key) {
StringBuffer sb = new StringBuffer();
Set<Entry<Object, Object>> es = parameters.entrySet();
Iterator<Entry<Object, Object>> it = es.iterator();
while (it.hasNext()) {
Map.Entry<Object, Object> entry = (Map.Entry<Object, Object>) it.next();
String k = (String) entry.getKey();
Object v = entry.getValue();
if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
/** 支付密钥必须参与加密,放在字符串最后面 */
sb.append("key=" + key);
String sign = MD5.MD5Encode(sb.toString()).toUpperCase();
return sign;
}
/**
*
* @param requestUrl请求地址
* @param requestMethod请求方法
* @param outputStr参数
*/
public static String httpRequest(String requestUrl,String requestMethod,String outputStr){
// 创建SSLContext
StringBuffer buffer=null;
try{
URL url = new URL(requestUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(requestMethod);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.connect();
//往服务器端写内容
if(null !=outputStr){
OutputStream os=conn.getOutputStream();
os.write(outputStr.getBytes("utf-8"));
os.close();
}
// 读取服务器端返回的内容
InputStream is = conn.getInputStream();
InputStreamReader isr = new InputStreamReader(is, "utf-8");
BufferedReader br = new BufferedReader(isr);
buffer = new StringBuffer();
String line = null;
while ((line = br.readLine()) != null) {
buffer.append(line);
}
}catch(Exception e){
e.printStackTrace();
}
return buffer.toString();
}
public static String urlEncodeUTF8(String source){
String result=source;
try {
result=java.net.URLEncoder.encode(source, "UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
/**
* 退款
*/
public static Map<String, String> doRefund(String url,String data,String partner) throws Exception {
KeyStore keyStore = KeyStore.getInstance("PKCS12");
URL url2 = WXUtil.class.getClassLoader().getResource("apiclient_cert.p12");
FileInputStream instream = new FileInputStream(new File(url2.toURI()));//P12文件目录
try {
keyStore.load(instream, partner.toCharArray());
} finally {
instream.close();
}
SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, partner.toCharArray()).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,new String[] { "TLSv1" }, null,SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
try {
HttpPost httpost = new HttpPost(url); // 设置响应头信息
httpost.addHeader("Connection", "keep-alive");
httpost.addHeader("Accept", "*/*");
httpost.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
httpost.addHeader("Host", "api.mch.weixin.qq.com");
httpost.addHeader("X-Requested-With", "XMLHttpRequest");
httpost.addHeader("Cache-Control", "max-age=0");
httpost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");
httpost.setEntity(new StringEntity(data, "UTF-8"));
CloseableHttpResponse response = httpclient.execute(httpost);
try {
HttpEntity entity = response.getEntity();
String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8");
EntityUtils.consume(entity);
return WXUtil.doXMLParse(jsonStr);
} finally {
response.close();
}
} finally {
httpclient.close();
}
}
/**
* 是否签名正确,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
* @return boolean
*/
public static boolean isTenpaySign(String characterEncoding, SortedMap<Object, Object> packageParams, String API_KEY) {
StringBuffer sb = new StringBuffer();
Set es = packageParams.entrySet();
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
String v = (String)entry.getValue();
if(!"sign".equals(k) && null != v && !"".equals(v)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + API_KEY);
//算出摘要
String mysign = MD5.MD5Encode(sb.toString()).toUpperCase();
String tenpaySign = ((String)packageParams.get("sign")).toLowerCase();
return tenpaySign.equals(mysign);
}
}
package com.ctrip.fun.golf.domain.payment;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.alibaba.fastjson.JSONObject;
public class WeiXinAtcion {
/**
* 退款函数,该方法可以对曾经部分退款的订单进行再次退款
* @param out_trade_no 商户订单号
* @param total_fee1 退款对应的订单的总金额(以“元”为单位)
* @param refund_fee1 计划退款的金额(以“元”为单位)
* @throws Exception
*/
public static Map<String, String> wechatRefund(String out_trade_no,int all_total_fee,int refund_fee) throws Exception{
SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();
packageParams.put("appid",Configure.getAppID());
packageParams.put("mch_id",Configure.getMch_id());
packageParams.put("op_user_id",Configure.getMch_id());
packageParams.put("nonce_str", WXUtil.generate());
packageParams.put("out_trade_no", out_trade_no);
packageParams.put("out_refund_no", WXUtil.generate());
packageParams.put("total_fee",String.valueOf(all_total_fee));
packageParams.put("refund_fee", String.valueOf(refund_fee));
String sign = WXUtil.createSign_ChooseWXPay("UTF-8", packageParams, Configure.getKey());
packageParams.put("sign", sign);
String XML = WXUtil.getRequestXml(packageParams);
return WXUtil.doRefund("https://api.mch.weixin.qq.com/secapi/pay/refund", XML,Configure.getMch_id());
}
/**
* 生成微信订单
* @param openid
* @param period_number
* @param merchant_id
* @param num
* @return
*/
public static JSONObject weixinPlay(String openid,int total_fee,String out_trade_no,String notify_url,String body) throws UnsupportedEncodingException, DocumentException {
SortedMap<Object, Object> paymentPo = new TreeMap<Object, Object>();
paymentPo.put("appid",Configure.getAppID());
paymentPo.put("mch_id",Configure.getMch_id());
paymentPo.put("nonce_str", WXUtil.generate());
paymentPo.put("body",body);
paymentPo.put("out_trade_no",out_trade_no);
paymentPo.put("total_fee",String.valueOf(total_fee));
paymentPo.put("spbill_create_ip", "127.0.0.1");//这里填你的ip地址
paymentPo.put("notify_url", notify_url);
paymentPo.put("trade_type", "JSAPI");
paymentPo.put("openid", openid);
paymentPo.put("sign", WXUtil.createSign_ChooseWXPay("UTF-8", paymentPo, Configure.getKey()));
String param = WXUtil.getRequestXml(paymentPo);
String request = WXUtil.httpRequest("https://api.mch.weixin.qq.com/pay/unifiedorder", "POST", param);
Map<String, String> map = new HashMap<String, String>(); // 将解析结果存储在HashMap中
InputStream in = new ByteArrayInputStream(request.getBytes());
SAXReader reader = new SAXReader(); // 读取输入流
Document document = reader.read(in);
Element root = document.getRootElement(); // 得到xml根元素
@SuppressWarnings("unchecked") // 得到根元素的所有子节点
List<Element> elementList = root.elements();
for (Element element : elementList) {
map.put(element.getName(), element.getText());
}
JSONObject result = new JSONObject();
if (map.get("return_code").equals("SUCCESS")) { // 业务结果
String nonceStr =WXUtil.generate();
Long timeStamp = System.currentTimeMillis() / 1000;
SortedMap<Object, Object> params = new TreeMap<Object, Object>();
params.put("appId", Configure.getAppID());
params.put("nonceStr", nonceStr);
params.put("package", "prepay_id=" + map.get("prepay_id"));
params.put("signType", "MD5");
params.put("timeStamp", timeStamp);
params.put("key", Configure.getKey());
result.put("timeStamp", timeStamp + "");
result.put("nonceStr", nonceStr);
result.put("package", "prepay_id=" + map.get("prepay_id"));
result.put("signType", "MD5");
result.put("paySign", WXUtil.createSign_ChooseWXPay("UTF-8", params, Configure.getKey()));
result.put("return_code", "Success");
}else {
result.put("return_code", "Fail");
result.put("return_msg", map.get("fail"));
}
return result;
}
/**
* 支付成功的回调函数
* @param request
* @param response
* @throws Exception
*/
public void weixinpay_notify(HttpServletRequest request,HttpServletResponse response) throws Exception{
InputStream inputStream ;
StringBuffer sb = new StringBuffer();
inputStream = request.getInputStream();
String s ;
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
while ((s = in.readLine()) != null){
sb.append(s);
}
in.close();
inputStream.close();
Map<String, String> m = new HashMap<String, String>();
m = WXUtil.doXMLParse(sb.toString());
SortedMap<Object,Object> packageParams = new TreeMap<Object,Object>();
Iterator it = m.keySet().iterator();
while (it.hasNext()) {
String parameter = (String) it.next();
String parameterValue = m.get(parameter);
String v = "";
if(null != parameterValue) {
v = parameterValue.trim();
}
packageParams.put(parameter, v);
}
String key = ""; //秘钥
if(WXUtil.isTenpaySign("UTF-8", packageParams,key)) {
String resXml = "";
if("SUCCESS".equals((String)packageParams.get("result_code"))){
//得到返回的参数
String openid = (String)packageParams.get("openid");
String transaction_id = (String)packageParams.get("transaction_id");
String out_trade_no = (String)packageParams.get("out_trade_no");
String total_fee = (String)packageParams.get("total_fee");
Float fee= Float.parseFloat(total_fee)/100;
//这里可以写你需要的业务
resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
out.write(resXml.getBytes());
out.flush();
out.close();
} else {
System.out.println("回调失败");
}
} else{
System.out.println("回调失败");
}
}
}
package com.ctrip.fun.golf.domain.payment;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver;
/**
* 微信支付,工具类
*
* @author muyunfei
*
*<p>Modification History:</p>
*<p>Date Author Description</p>
*<p>------------------------------------------------------------------</p>
*<p>11 30, 2016 muyunfei 新建</p>
*/
public class WxPayUtil {
/**
* 签名
* 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),
* 使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
* 特别注意以下重要规则:
* ◆ 参数名ASCII码从小到大排序(字典序);
* ◆ 如果参数的值为空不参与签名;
* ◆ 参数名区分大小写;
* ◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
* ◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
* 第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
* key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
* @param map
* @return
* @throws UnsupportedEncodingException
*/
public static String getSign(Map<String,Object> map) throws UnsupportedEncodingException{
ArrayList<String> list = new ArrayList<String>();
for(Map.Entry<String,Object> entry:map.entrySet()){
//参数为空不参与签名
if(entry.getValue()!=""){
list.add(entry.getKey() + "=" + entry.getValue());
}
}
int size = list.size();
String [] arrayToSort = list.toArray(new String[size]);
Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
StringBuilder sb = new StringBuilder();
for(int i = 0; i < size; i ++) {
sb.append(arrayToSort[i]);
if(i!=size-1){
sb.append("&");
}
}
String result = sb.toString();
result += "&key=" + Configure.getKey();
//Util.log("Sign Before MD5:" + result);
result = MD5.MD5Encode(result).toUpperCase();
//Util.log("Sign Result:" + result);
return result;
}
/**
* 签名算法
* @param o 要参与签名的数据对象
* @return 签名
* @throws IllegalAccessException
*/
public static String getSign(Object o) throws IllegalAccessException {
ArrayList<String> list = new ArrayList<String>();
Class cls = o.getClass();
Field[] fields = cls.getDeclaredFields();
for (Field f : fields) {
f.setAccessible(true);
if (f.get(o) != null && f.get(o) != "") {
list.add(f.getName() + "=" + f.get(o) );
}
}
int size = list.size();
String [] arrayToSort = list.toArray(new String[size]);
Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
StringBuilder sb = new StringBuilder();
for(int i = 0; i < size; i ++) {
sb.append(arrayToSort[i]);
if(i!=size-1){
sb.append("&");
}
}
String result = sb.toString();
result += "&key=" + Configure.getKey();
result = MD5.MD5Encode(result).toUpperCase();
return result;
}
/**
* 生成随机字符串
* @param length
* @return
*/
public static String getRandomString2(int length){
Random random = new Random();
StringBuffer sb = new StringBuffer();
for(int i = 0; i < length; ++i){
int number = random.nextInt(3);
long result = 0;
switch(number){
case 0:
result = Math.round(Math.random() * 25 + 65);
sb.append(String.valueOf((char)result));
break;
case 1:
result = Math.round(Math.random() * 25 + 97);
sb.append(String.valueOf((char)result));
break;
case 2:
sb.append(String.valueOf(new Random().nextInt(10)));
break;
}
}
return sb.toString();
}
/**
* 获取xml信息
* @param xmlString
* @return
* @throws ParserConfigurationException
* @throws IOException
* @throws SAXException
*/
public static Map<String,Object> getMapFromXML(String xmlString) throws ParserConfigurationException, IOException, SAXException {
//这里用Dom的方式解析回包的最主要目的是防止API新增回包字段
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
InputStream is = null;
if (xmlString != null && !xmlString.trim().equals("")) {
is = new ByteArrayInputStream(xmlString.getBytes("utf-8"));
}
Document document = builder.parse(is);
//获取到document里面的全部结点
NodeList allNodes = document.getFirstChild().getChildNodes();
Node node;
Map<String, Object> map = new HashMap<String, Object>();
int i=0;
while (i < allNodes.getLength()) {
node = allNodes.item(i);
if(node instanceof Element){
map.put(node.getNodeName(),node.getTextContent());
}
i++;
}
return map;
}
/**
* 扩展xstream使其支持CDATA
* 内部类XppDriver
*/
private static XStream xstream = new XStream(new XppDriver() {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
// 对所有xml节点的转换都增加CDATA标记
boolean cdata = true;
public void startNode(String name, Class clazz) {
super.startNode(name, clazz);
}
protected void writeText(QuickWriter writer, String text) {
if (cdata) {
//writer.write("<![CDATA[");
writer.write(text);
//writer.write("]]>");
} else {
writer.write(text);
}
}
};
}
});
}
......@@ -1063,6 +1063,7 @@ public class VoucherService {
voucher.setRemark(voucherRule.getRemark());
voucher.setDescription(voucherRule.getDescription());
voucher.setShared(voucherRule.getShared());
voucher.setUserLimit(voucherRule.getUserLimit());
return voucher;
}
......
......@@ -15,6 +15,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import com.alibaba.fastjson.JSONObject;
import com.ctrip.fun.common.core.util.BeanConverter;
import com.ctrip.fun.common.core.util.DateUtil;
import com.ctrip.fun.common.core.util.IdcardUtils;
......@@ -24,12 +25,10 @@ import com.ctrip.fun.common.vo.PagedResponseBean;
import com.ctrip.fun.common.vo.Response;
import com.ctrip.fun.common.vo.ResponseStatusEnum;
import com.ctrip.fun.common.vo.basic.AbstractRuleConditionBean;
import com.ctrip.fun.common.vo.basic.CourseRuleConditionBaseBean;
import com.ctrip.fun.common.vo.basic.MultipleCourseConditionBean;
import com.ctrip.fun.common.vo.basic.VipGradeEnum;
import com.ctrip.fun.common.vo.order.AbstractOrderBean;
import com.ctrip.fun.common.vo.order.AbstractOrderListItemBean;
import com.ctrip.fun.common.vo.order.CourseOrderResourceBean;
import com.ctrip.fun.common.vo.order.CustomerInfoBean;
import com.ctrip.fun.common.vo.order.InvoiceBean;
import com.ctrip.fun.common.vo.order.OrderCallBackBean;
......@@ -54,14 +53,13 @@ import com.ctrip.fun.golf.dao.user.UserExtDao;
import com.ctrip.fun.golf.domain.basic.Voucher;
import com.ctrip.fun.golf.domain.basic.VoucherRule;
import com.ctrip.fun.golf.domain.order.CustomerInfo;
import com.ctrip.fun.golf.domain.order.EventActivityOrderItem;
import com.ctrip.fun.golf.domain.order.InsuranceInfo;
import com.ctrip.fun.golf.domain.order.InsuranceProcess;
import com.ctrip.fun.golf.domain.order.Invoiceinfo;
import com.ctrip.fun.golf.domain.order.Order;
import com.ctrip.fun.golf.domain.payment.WeiXinAtcion;
import com.ctrip.fun.golf.domain.user.UserExt;
import com.ctrip.fun.golf.exceptions.OrderException;
import com.ctrip.fun.golf.exceptions.VoucherException;
import com.ctrip.fun.golf.service.basic.VoucherService;
import com.ctrip.fun.golf.service.payment.OrderPaymentService;
import com.ctrip.fun.golf.service.user.UserExtService;
......@@ -83,9 +81,9 @@ public abstract class AbstractOrderService<H extends AbstractOrderBean<T>, T> ex
private InvoiceinfoDao invoiceinfoDao = null;
private UserExtDao userExtDao = null;
protected UserExtDao userExtDao = null;
private VoucherDao voucherDao = null;
protected VoucherDao voucherDao = null;
private VoucherRuleDao voucherRuleDao = null;
......@@ -229,6 +227,24 @@ public abstract class AbstractOrderService<H extends AbstractOrderBean<T>, T> ex
return null;
}
public Response<JSONObject> placeOrderWeiXinPay(H abstractOrderBean) throws Exception{
this.checkParameters(abstractOrderBean);
if (this.beforePlaceOrder(abstractOrderBean)) {
this.adjustOrderPayAmount(abstractOrderBean);
Order order = this.saveOrder(abstractOrderBean);
this.saveOrUpdateInvoice(abstractOrderBean.getInvoice(), order);
this.saveOrderItems(abstractOrderBean, order.getOrderId());
this.saveCustomers(abstractOrderBean, order.getOrderId());
this.saveInsuranceInfo(abstractOrderBean, order.getOrderId(), order.getOrderNo());
this.afterPlaceOrder(abstractOrderBean, order.getOrderId());
return this.submitWeiXinOrder(abstractOrderBean, order);
}
return null;
}
protected void adjustOrderPayAmount(H abstractOrderBean) {
}
......@@ -880,6 +896,24 @@ public abstract class AbstractOrderService<H extends AbstractOrderBean<T>, T> ex
}
/**
* 提交订单进入支付流程
*
* @param abstractOrderBean
* @return Response<PaymentRequestBean> 当不需要走携程支付的时候body为null
*/
private Response<JSONObject> submitWeiXinOrder(H abstractOrderBean, Order order) {
if (!this.beforeSubmitOrder(abstractOrderBean, order)) {
return null;
}
Response<JSONObject> result = new Response<JSONObject>();
result.setStatus(ResponseStatusEnum.SUCCESS.getValue());
result = this.submitWeiXinPrepay(abstractOrderBean, order);
this.afterSubmitOrder(abstractOrderBean, order, null);
return null;
}
/**
* 提交现付订单
*
* @param order
......@@ -900,6 +934,12 @@ public abstract class AbstractOrderService<H extends AbstractOrderBean<T>, T> ex
protected abstract String getNotifyUrl(Order order);
protected String getNotifyUrlForWeiXinPay(Order order){
return "";
}
/**
* 预授权
*
......@@ -942,7 +982,7 @@ public abstract class AbstractOrderService<H extends AbstractOrderBean<T>, T> ex
*
* @param order Order
*/
private void checkPrePayCard(Order order) {
protected void checkPrePayCard(Order order) {
UserExt userExt = userExtDao.getUserExtInfoByUid(order.getUid());
if (order.getPrePayCardAmount().doubleValue() > 0 && userExt.getPrePayCardAmount().subtract(order.getPrePayCardAmount()).doubleValue() < 0) {
throw new OrderException(-1, "提交订单失败,预付卡金额不足!");
......@@ -1055,6 +1095,64 @@ public abstract class AbstractOrderService<H extends AbstractOrderBean<T>, T> ex
}
}
/**
* 提交部分预付或预付的订单
*
* @param order Order
* @param submitOrderResponse SubmitOrderResponseDTO
* @return
*/
private Response<JSONObject> submitWeiXinPrepay(H abstractOrderBean, Order order) {
// order.setIsThird(1);
this.checkPrePayCard(order);
this.checkVoucher(order);
Response<JSONObject> response = new Response<JSONObject>();
response.setStatus(0);
response.setMessage("异常");
BigDecimal invoiceAmount = order.getInvoiceAmount() == null ? new BigDecimal(0) : order.getInvoiceAmount();
BigDecimal postageAmount = order.getPostageAmount() == null ? new BigDecimal(0) : order.getPostageAmount();
BigDecimal insuranceAmount = order.getInsuranceAmount() == null ? new BigDecimal(0) : order.getInsuranceAmount();
BigDecimal needPayAmount = order.getPrePayAmount().add(invoiceAmount).add(postageAmount).add(insuranceAmount).subtract(order.getPrePayCardAmount()).subtract(order.getVoucherAmount());
// 需要走支付
if (needPayAmount.doubleValue() > 0) {
JSONObject jSONObject = null;
//调用微信下单的逻辑
UserExt userExt = getUserExtDao().getByUid(abstractOrderBean.getUid());
try {
jSONObject = WeiXinAtcion.weixinPlay(userExt.getMiniAppOpenId(),needPayAmount.multiply(new BigDecimal("100")).intValue(), order.getOrderId()+"", this.getNotifyUrlForWeiXinPay(order), "dingqiu");
} catch (Exception e) {
e.printStackTrace();
}
if ("Success".equals(jSONObject.get("return_code").toString())) {
order.setOrderType(1);
order.setProcessStatus(order.getProcessStatus() | OrderStatusBitEnum.DEDUCTING.getValue());
order.setApplyTime(new Date());
order.setOrderStatus("P");
order.setOrderUserStatus(UserOrderStatusEnum.WAITING_PAY.getValue());
getOrderDao().update(order);
//为了多球场抵用券,所以在这一步就更新bsc_voucher中的amount
if (order.getVoucherAmount().doubleValue() > 0) {
List<VoucherItemBean> beanlist = abstractOrderBean.getVoucherList();
int usedCount = 0;
if(beanlist.size()>0){
for(VoucherItemBean bean: beanlist){
usedCount += voucherDao.useVoucher(bean.getId()+"", bean.getAmount());
}
if(usedCount != order.getVoucherCount()){
throw new OrderException(-100, "您的抵用劵使用错误");
}
}
}
response.setStatus(1);
response.setBody(jSONObject);
}
}
return response;
}
protected void updateVipmemberInfo(Order order){
BigDecimal discount = order.getVipmemberDiscount();
if(discount != null && discount.compareTo(BigDecimal.ZERO)>0){
......
......@@ -2,7 +2,6 @@
* Copyright 2014 CTRIP Co.,Ltd. All rights reserved.
*/
package com.ctrip.fun.golf.service.order;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
......@@ -12,10 +11,8 @@ import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ctrip.fun.common.core.util.BeanConverter;
import com.ctrip.fun.common.core.util.DateUtil;
import com.ctrip.fun.common.core.util.StringUtils;
......@@ -120,6 +117,8 @@ public class EventActivityOrderService extends
private String eventActivityBaseNotifyUrl;
private String eventActivityBaseNotifyUrlForWeiXinPay;
private EventActivityOrderItemDao eventActivityOrderItemDao = null;
private CourseResourceService courseResourceService = null;
......@@ -130,6 +129,10 @@ public class EventActivityOrderService extends
private EventCustomerInfoService eventCustomerInfoService = null;
public Order findByResourceId(String uid, int resourceId, Date playDate) {
List<EventActivityOrderItem> eventActivityOrderItemList = eventActivityOrderItemDao
.queryOrderItem(resourceId, playDate);
......@@ -1512,6 +1515,16 @@ public class EventActivityOrderService extends
return notifyPath;
}
/**
* @return
* @see com.ctrip.fun.golf.service.order.AbstractOrderService#getNotifyUrl()
*/
@Override
protected String getNotifyUrlForWeiXinPay(Order order) {
String notifyUrlForWeiXinPay = this.getEventActivityBaseNotifyUrlForWeiXinPay();
return notifyUrlForWeiXinPay;
}
@Override
public void updateEventCustomersInvalid(Integer orderId) {
eventCustomerInfoService.updateEventCustomerInfosByOrderId(orderId, false);
......@@ -1531,6 +1544,16 @@ public class EventActivityOrderService extends
eventCustomerInfoService.updateEventCustomerInfosByOrderId(order.getOrderId(), false);
}
public String getEventActivityBaseNotifyUrlForWeiXinPay() {
return eventActivityBaseNotifyUrlForWeiXinPay;
}
public void setEventActivityBaseNotifyUrlForWeiXinPay(
String eventActivityBaseNotifyUrlForWeiXinPay) {
this.eventActivityBaseNotifyUrlForWeiXinPay = eventActivityBaseNotifyUrlForWeiXinPay;
}
public String getEventActivityBaseNotifyUrl() {
return eventActivityBaseNotifyUrl;
}
......
......@@ -6,6 +6,7 @@ package com.ctrip.fun.golf.service.payment;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -34,6 +35,7 @@ import com.ctrip.fun.golf.domain.order.Invoiceinfo;
import com.ctrip.fun.golf.domain.order.Order;
import com.ctrip.fun.golf.domain.order.OrderProcessLog;
import com.ctrip.fun.golf.domain.payment.PaymentResult;
import com.ctrip.fun.golf.domain.payment.WXUtil;
import com.ctrip.fun.golf.exceptions.OrderException;
import com.ctrip.fun.golf.exceptions.UserException;
import com.ctrip.fun.golf.service.basic.VoucherService;
......@@ -123,6 +125,48 @@ public abstract class AbstractNotifyService extends CorePaymentService {
return notifyResponseBean;
}
public String notifyForWeiXinPay(String xml) throws Exception{
Map<String,Object> notifyMap = WXUtil.doXMLParse(xml);
if(notifyMap.get("return_code").equals("SUCCESS")){
String orderId = notifyMap.get("out_trade_no").toString();//商户订单号
Order order = this.orderDao.getAndLockOrderByOutTradeId(orderId);
if(notifyMap.get("result_code").equals("SUCCESS")){
// 4、设置订单的状态:除去扣款失败,增加已扣款状态
order.setProcessStatus(order.getProcessStatus()
& (OrderStatusBitEnum.getSumStatusValue() - OrderStatusBitEnum.DEDUCT_FAILED
.getValue()));
order.setProcessStatus(order.getProcessStatus() | OrderStatusBitEnum.DEDUCTED.getValue());
// 5、扣除现金券、账户余额、抵用发票的积分、以及投保动作(此步骤中基本每一步都是重启事务)
// 5.1、扣除现金券
if (order.getVoucherAmount().doubleValue() > 0) {
try {
this.voucherService.userVoucher(order.getVoucherCount(), order.getOrderNo(),
order.getVoucherIDList());
} catch (Exception e) {
logger.warn(e.getMessage(), e);
handPayException(order, e);
}
}
// 6、更新订单信息(状态)
this.orderDao.update(order);
}else{
if (order.getOrderStatusEnum() == OrderStatusEnum.CHARGING && order.getCancelStatus() == 0) {
this.doPayFail(order);
}
order.setProcessStatus(order.getProcessStatus()
| OrderStatusBitEnum.DEDUCT_FAILED.getValue());
}
}
return null;
}
public String notifyForWeiXinRefound(String xml) throws Exception{
Map<String,Object> notifyMap = WXUtil.doXMLParse(xml);
return null;
}
/**
* 支付调用方法
*/
......@@ -138,10 +182,11 @@ public abstract class AbstractNotifyService extends CorePaymentService {
this.orderDao.update(order);
}
/**
* 返回成功支付方法
*/
private void paySuccess(NotifyRequestBean notifyRequestBean, Order order) {
protected void paySuccess(NotifyRequestBean notifyRequestBean, Order order) {
// 1、成功扣款的订单则返回;
if (order.isPaied()) {
return;
......@@ -324,7 +369,7 @@ public abstract class AbstractNotifyService extends CorePaymentService {
protected abstract void doPaySuccess(Order order);
private void payFail(NotifyRequestBean notifyRequestBean, Order order) {
protected void payFail(NotifyRequestBean notifyRequestBean, Order order) {
if (order.getOrderStatusEnum() == OrderStatusEnum.CHARGING && order.getCancelStatus() == 0) {
this.doPayFail(order);
}
......
......@@ -3,13 +3,22 @@
*/
package com.ctrip.fun.golf.service.payment;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.UUID;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.ParameterizedTypeReference;
......@@ -17,6 +26,7 @@ import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.web.client.RestTemplate;
import com.alibaba.fastjson.JSONObject;
import com.ctrip.fun.common.core.util.DateUtil;
import com.ctrip.fun.common.core.util.JsonUtil;
import com.ctrip.fun.common.core.util.RSA;
......@@ -37,8 +47,10 @@ import com.ctrip.fun.common.vo.product.ProductPayModeEnum;
import com.ctrip.fun.golf.dao.GenericHibernateDao;
import com.ctrip.fun.golf.dao.payment.PaymentRequestDao;
import com.ctrip.fun.golf.domain.order.AbstractOrder;
import com.ctrip.fun.golf.domain.payment.Configure;
import com.ctrip.fun.golf.domain.payment.PaymentRequest;
import com.ctrip.fun.golf.domain.payment.PaymentResult;
import com.ctrip.fun.golf.domain.payment.WXUtil;
/**
* @author zgsong
......@@ -398,6 +410,72 @@ public abstract class AbstractPaymentService<T extends AbstractOrder> extends Co
return result;
}
/**
* 生成微信订单
* @param openid
* @param period_number
* @param merchant_id
* @param num
* @return
*/
public static JSONObject weixinPlay(String openid,int total_fee,String out_trade_no,String notify_url,String body) throws Exception {
SortedMap<Object, Object> paymentPo = new TreeMap<Object, Object>();
paymentPo.put("appid",Configure.getAppID());
paymentPo.put("mch_id",Configure.getMch_id());
paymentPo.put("nonce_str", WXUtil.generate());
paymentPo.put("body",body);
paymentPo.put("out_trade_no",out_trade_no);
paymentPo.put("total_fee",String.valueOf(total_fee));
paymentPo.put("spbill_create_ip", "127.0.0.1");//这里填你的ip地址
paymentPo.put("notify_url", notify_url);
paymentPo.put("trade_type", "JSAPI");
paymentPo.put("openid", openid);
String sign = WXUtil.createSign_ChooseWXPay("UTF-8", paymentPo, Configure.getKey());
paymentPo.put("sign", sign);
String param = WXUtil.getRequestXml(paymentPo);;
String request = WXUtil.httpRequest("https://api.mch.weixin.qq.com/pay/unifiedorder", "POST", param);
Map<String, String> map = new HashMap<String, String>(); // 将解析结果存储在HashMap中
InputStream in = new ByteArrayInputStream(request.getBytes());
SAXReader reader = new SAXReader(); // 读取输入流
Document document = reader.read(in);
Element root = document.getRootElement(); // 得到xml根元素
@SuppressWarnings("unchecked") // 得到根元素的所有子节点
List<Element> elementList = root.elements();
for (Element element : elementList) {
map.put(element.getName(), element.getText());
}
JSONObject result = new JSONObject();
if (map.get("return_code").equals("SUCCESS")) { // 业务结果
String nonceStr =WXUtil.generate();
Long timeStamp = System.currentTimeMillis() / 1000;
SortedMap<Object, Object> params = new TreeMap<Object, Object>();
params.put("appId", Configure.getAppID());
params.put("nonceStr", nonceStr);
params.put("package", "prepay_id=" + map.get("prepay_id"));
params.put("signType", "MD5");
params.put("timeStamp", timeStamp);
String paySign = WXUtil.createSign_ChooseWXPay("UTF-8", params, Configure.getKey());
result.put("timeStamp", timeStamp + "");
result.put("nonceStr", nonceStr);
result.put("package", "prepay_id=" + map.get("prepay_id"));
result.put("signType", "MD5");
result.put("paySign", paySign);
}else {
result.put("return_code", "Fail");
result.put("return_msg", map.get("return_msg"));
}
return result;
}
public Response<PaymentRequestBean> createFailPayOrder() {
Response<PaymentRequestBean> result = new Response<PaymentRequestBean>();
result.setStatus(ResponseStatusEnum.FAIL.getValue());
......
......@@ -4,16 +4,14 @@
package com.ctrip.fun.golf.service.payment;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import com.ctrip.fun.common.vo.order.OrderCategoryEnum;
import com.ctrip.fun.golf.dao.market.CommuneInviteActivityDao;
import com.ctrip.fun.golf.dao.order.CommuneOrderItemDao;
import com.ctrip.fun.golf.domain.order.CommuneOrderItem;
import com.ctrip.fun.golf.domain.order.Order;
import com.ctrip.fun.golf.domain.payment.WxPayUtil;
import com.ctrip.fun.golf.domain.payment.WXUtil;
import com.ctrip.fun.golf.service.basic.OperationMessageService;
import com.ctrip.fun.golf.service.basic.VoucherService;
import com.ctrip.fun.golf.service.market.CommuneInviteActivityService;
......@@ -36,7 +34,8 @@ public class CommuneNotifyService extends AbstractNotifyService {
public String notifyForMiniApp(String xml) throws Exception{
Map<String,Object> notifyMap = WxPayUtil.getMapFromXML(xml);
Map<String,Object> notifyMap = WXUtil.doXMLParse(xml);
if(notifyMap.get("return_code").equals("SUCCESS")){
if(notifyMap.get("result_code").equals("SUCCESS")){
String ordersSn = notifyMap.get("out_trade_no").toString();//商户订单号
......@@ -71,6 +70,30 @@ public class CommuneNotifyService extends AbstractNotifyService {
}
public String notifyForVoucherMiniApp(String xml) throws Exception{
Map<String,Object> notifyMap = WXUtil.doXMLParse(xml);
if(notifyMap.get("return_code").equals("SUCCESS")){
if(notifyMap.get("result_code").equals("SUCCESS")){
String ordersSn = notifyMap.get("out_trade_no").toString();//商户订单号
//根据订单号查询订单,修改订单相关信息
Order order = this.getOrderDao().getOrderByOrderNo(Long.parseLong(ordersSn));
try {
this.getOrderDao().updateOrderStatusForMiniApps(Long.parseLong(ordersSn));
} catch (Exception e) {
e.printStackTrace();
}
//执行发券
String uid = order.getUid();//下单人id
voucherService.sendVoucherForPlaceOrder(uid, order.getOrderId()+"", true, "buyVoucher_voucher_send");
}
}
return null;
}
@Override
protected void doPaySuccess(Order order) {
if(getCommuneYears(order.getOrderId()) <= 0){
......
......@@ -10,6 +10,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ctrip.fun.common.vo.operation.ResourceConfirmTypeEnum;
import com.ctrip.fun.common.vo.payment.NotifyRequestBean;
import com.ctrip.fun.common.vo.product.ResourceCategoryEnum;
import com.ctrip.fun.common.vo.product.ResourceInventoryQuery;
import com.ctrip.fun.golf.dao.order.EventActivityOrderItemDao;
......@@ -37,6 +38,23 @@ public class EventActivityNotifyService extends AbstractNotifyService {
private OperationMessageService operationMessageService;
/**
* 支付调用方法
*/
private void weiXinPayNotify(NotifyRequestBean notifyRequestBean) {
String outTradeId = notifyRequestBean.getOutTradeId();
Order order = this.getOrderDao().getAndLockOrderByOutTradeId(outTradeId);
if (SUCCESS.equalsIgnoreCase(notifyRequestBean.getStatus())) {
paySuccess(notifyRequestBean, order);
} else {
payFail(notifyRequestBean, order);
}
order.setPayDate(new Date());
this.getOrderDao().update(order);
}
protected void doPayFail(Order order) {
List<EventActivityOrderItem> eventActivityOrderItems = this.eventActivityOrderItemDao.getOrderItemByOrderId(order.getOrderId());
if (eventActivityOrderItems != null && eventActivityOrderItems.size() > 0 && order.getConfirmType() == ResourceConfirmTypeEnum.AUTO.getValue() && order.getCancelStatus() == 0) {
......
......@@ -9,8 +9,10 @@ payment.tourBaseNotifyUrl=http://112.65.124.86:18081/fun-common-soa/notify/tourO
payment.rechargeBaseNotifyUrl=http://112.65.124.86:18081/fun-common-soa/notify/rechargeOrder
payment.communeBaseNotifyUrl=http://112.65.124.86:18081/fun-common-soa/notify/communeOrder
payment.communeBaseNotifyUrlForMiniApp=http://112.65.124.86:18081/fun-common-soa/notify/notifyForMiniApp
payment.voucherNotifyUrlForMiniApp=http://112.65.124.86:18081/fun-common-soa/notify/notifyForVoucherMiniApp
payment.vipmemberBaseNotifyUrl=http://112.65.124.86:18081/fun-common-soa/notify/vipmemberOrder
payment.eventActivityBaseNotifyUrl=http://112.65.124.86:18081/fun-common-soa/notify/eventActivityOrder
payment.eventActivityBaseNotifyUrlForWeiXinPay=http://112.65.124.86:18081/fun-common-soa/notify/eventActivityOrder/notifyForWeiXinPay
payment.mallBaseNotifyUrl=http://112.65.124.86:18081/fun-common-soa/notify/mallOrder
payment.privateKey=MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKpQrSAzyJV0MfBN7qKvE8d73phdredNhF3cKm3IWKFlCWg/3alVWI6GE462rPc5A4T+shYcvzqhV5wSOS0QMfj9VfLPqUT+xggFcCQ48mbeX4Jy/N5QZB3RZuQu+YbmQT6f54h2sJvhqLurvE7sgW4qL7r6AaJfDsvYPjKSezYXAgMBAAECgYA32EY8Jd6iarwpMFSMEV4p7craKPVpv3gkkply79tn6EpCXZaf/HUSHpJxHCLw2Uf3JtBcAccOQXMJoMwQo5vOoMVl5nk+EZN//MB8Re8r/7GQV8E+myHdlntMjxOf38PGn9z8Ze0Q020fZwGjA6egBFcU/ld1lCcI0TAj3cZDcQJBANS9UOC3J5njhnuzACjQ1qTTXuv6hr2lbglr2za4Ju9xFJUkKXy2LBAp2LlakXZXDhf7lsqmwZg5BvOBK6DPl18CQQDM8tqqOr4LRJRhq2bqBx398IqtyoZpMshpzBXLr7bdhp7FR2N4AEoAGaa5hS5k3z5SYNLEGKFhRM+sFJBQjnRJAkBnq647I+YffxotM8jTGxpOjlbGhnqc9n4OB0p3evw2WRPfrhStmpUUd2AOy4zxb3EFzOvp66OSC9BQX9Uj86XfAkEAouGbgVDgOupNFvZ2+yWe43Ppc0eS3UZ72wFUjSXgKlzUECu1VOi95yh7xdOf1JFL4YKL30dH8psShUtuimc86QJAeBXASabJBcHAIisPkODvsciiz1pzm1WSuXRUxnuis0TRTRs7+2KEnWE4UV3jxehxkc1RAgteYosWXg5TWQgiUg==
......
......@@ -9,8 +9,10 @@ payment.tourBaseNotifyUrl=http://112.65.124.86:18081/fun-common-soa/notify/tourO
payment.rechargeBaseNotifyUrl=http://112.65.124.86:18081/fun-common-soa/notify/rechargeOrder
payment.communeBaseNotifyUrl=http://112.65.124.86:18081/fun-common-soa/notify/communeOrder
payment.communeBaseNotifyUrlForMiniApp=http://112.65.124.86:18081/fun-common-soa/notify/notifyForMiniApp
payment.voucherNotifyUrlForMiniApp=http://112.65.124.86:18081/fun-common-soa/notify/notifyForVoucherMiniApp
payment.vipmemberBaseNotifyUrl=http://112.65.124.86:18081/fun-common-soa/notify/vipmemberOrder
payment.eventActivityBaseNotifyUrl=http://112.65.124.86:18081/fun-common-soa/notify/eventActivityOrder
payment.eventActivityBaseNotifyUrlForWeiXinPay=http://112.65.124.86:18081/fun-common-soa/notify/eventActivityOrder/notifyForWeiXinPay
payment.mallBaseNotifyUrl=http://112.65.124.86:18081/fun-common-soa/notify/mallOrder
#payment.privateKey=MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKpQrSAzyJV0MfBN7qKvE8d73phdredNhF3cKm3IWKFlCWg/3alVWI6GE462rPc5A4T+shYcvzqhV5wSOS0QMfj9VfLPqUT+xggFcCQ48mbeX4Jy/N5QZB3RZuQu+YbmQT6f54h2sJvhqLurvE7sgW4qL7r6AaJfDsvYPjKSezYXAgMBAAECgYA32EY8Jd6iarwpMFSMEV4p7craKPVpv3gkkply79tn6EpCXZaf/HUSHpJxHCLw2Uf3JtBcAccOQXMJoMwQo5vOoMVl5nk+EZN//MB8Re8r/7GQV8E+myHdlntMjxOf38PGn9z8Ze0Q020fZwGjA6egBFcU/ld1lCcI0TAj3cZDcQJBANS9UOC3J5njhnuzACjQ1qTTXuv6hr2lbglr2za4Ju9xFJUkKXy2LBAp2LlakXZXDhf7lsqmwZg5BvOBK6DPl18CQQDM8tqqOr4LRJRhq2bqBx398IqtyoZpMshpzBXLr7bdhp7FR2N4AEoAGaa5hS5k3z5SYNLEGKFhRM+sFJBQjnRJAkBnq647I+YffxotM8jTGxpOjlbGhnqc9n4OB0p3evw2WRPfrhStmpUUd2AOy4zxb3EFzOvp66OSC9BQX9Uj86XfAkEAouGbgVDgOupNFvZ2+yWe43Ppc0eS3UZ72wFUjSXgKlzUECu1VOi95yh7xdOf1JFL4YKL30dH8psShUtuimc86QJAeBXASabJBcHAIisPkODvsciiz1pzm1WSuXRUxnuis0TRTRs7+2KEnWE4UV3jxehxkc1RAgteYosWXg5TWQgiUg==
#payment.publicKey=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCdLrr1avVHbvsSfE2st2aBs1aQ0ZpHv9J/J3/iCCnHULBHgNOJC/a4bbwXr0yz3pmURDDJgaGtIL5qI27zPl43YZFPETRdu/lni9Re7NK81qgfP4ah+10afUmrhR3636Q9Lk77NxECfqvANVDiwuvw7/MfGKek97g8eN9grCAhWQIDAQAB
......
......@@ -155,6 +155,7 @@
<property name="userService" ref="userService"></property>
<property name="resourcePriceDao" ref="resourcePriceDao"></property>
<property name="eventActivityBaseNotifyUrl" value="${payment.eventActivityBaseNotifyUrl}"></property>
<property name="eventActivityBaseNotifyUrlForWeiXinPay" value="${payment.eventActivityBaseNotifyUrlForWeiXinPay}"></property>
<property name="operationMessageService" ref="operationMessageService"></property>
<property name="eventCustomerInfoDao" ref="eventCustomerInfoDao"></property>
<property name="eventCustomerInfoService" ref="eventCustomerInfoService"></property>
......@@ -194,6 +195,7 @@
<property name="overTimeMinute" value="${payment.longOvertime}"></property>
<property name="communeBaseNotifyUrl" value="${payment.communeBaseNotifyUrl}"></property>
<property name="communeBaseNotifyUrlForMiniApp" value="${payment.communeBaseNotifyUrlForMiniApp}"></property>
<property name="voucherNotifyUrlForMiniApp" value="${payment.voucherNotifyUrlForMiniApp}"></property>
<property name="COMMUNE_AMOUNT" value="${communeAmount}"></property>
<property name="COMMUNE_AMOUNT2" value="${communeAmount2}"></property>
<property name="clientConfigDao" ref="clientConfigDao"></property>
......
......@@ -11,8 +11,10 @@ payment.tourBaseNotifyUrl=http\://api.iwanoutdoor.com/fun-common-soa/notify/tour
payment.rechargeBaseNotifyUrl=http\://api.iwanoutdoor.com/fun-common-soa/notify/rechargeOrder
payment.communeBaseNotifyUrl=http\://api.iwanoutdoor.com/fun-common-soa/notify/communeOrder
payment.communeBaseNotifyUrlForMiniApp=http\://api.iwanoutdoor.com/fun-common-soa/notify/notifyForMiniApp
payment.voucherNotifyUrlForMiniApp=http\://api.iwanoutdoor.com/fun-common-soa/notify/notifyForVoucherMiniApp
payment.vipmemberBaseNotifyUrl=http\://api.iwanoutdoor.com/fun-common-soa/notify/vipmemberOrder
payment.eventActivityBaseNotifyUrl=http\://api.iwanoutdoor.com/fun-common-soa/notify/eventActivityOrder
payment.eventActivityBaseNotifyUrlForWeiXinPay=http\://api.iwanoutdoor.com/fun-common-soa/notify/eventActivityOrder/notifyForWeiXinPay
payment.mallBaseNotifyUrl=http\://api.iwanoutdoor.com/fun-common-soa/notify/mallOrder
payment.privateKey=MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKcptp51DHQ6jYuAfYBUkTyqkQoAGpwmoi69lmpsVU6r57KGpYV2lAoQBq/4gHW/9s5yTSg12ZRERZlhNxpxRyRfM4fFq6CCTnIAWtjq7t/q3CriitAH4QVqQH6UXauJf07Lugd1/oePzwooQ5X9tWWRfbN4TvRDJLKlAJcdO0qHAgMBAAECgYBJrbMWSJUCrcQxlqK6a4vQZ4WiGMWhyc12OI4RvkojcNWg9IQEPW2mucWYzjkgrUnFWM/1RzbtiOH8ZsL43rDx+lVKpl3haQW76ARXH3tgZgxwjcW+bVZrDqMdq+ScjxjaF4xMvq7uWh9S30da5s8NAQV63KCOx/jF7e4/0LVaMQJBAN1Zby637VHekCr7WGILEJwgzfnpk7j6TwzP7T50gpenfRtYPYu8XoJLRuWzgyATHSs45J+Ry/x0y3+UJjIYpCsCQQDBVMLSd6DD3LjkK85rVo/AVzrbfjor8LkxDh8E41MPwAWVdFgTzvCN6pfvZVHbwWjIOs/tSYIHsmu0P7SwmPkVAkAN9YbqdlT0FcoXu9QeEr6Qag0zVoSnZLm5gB9hEe3ubHSaVd1Dw7ReGSs2bzS0wB/Vyve4DHTFzgPLXudtv1oTAkAz/vHu3RG127U2WLnJkJxU5KEFy2slyjZkhSG+lM0QHVrjGUle+nckFAYM8rkTW28s+vRVI0H/g/MHpWKZZGsJAkAuxUzmbfpX9JRB2kFr6hUzRkCDLu60A494NoOhrxTs8KzPEa1OOYa2+SZB+ycUwBIlir7zrMkmOrZGgn7ewv1M
payment.publicKey=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2o4PJ2ZMtvx5S6qIbObDBHvatB3fOtRkhIdQp+5DQDkWh9mPU5gw3nE+K7cek0Q6h5bXrWrIMvEVNYbh6MhFhbcL4kwqZzS6+7B9Qe8DNvzoTNclTQ9xYgiRxOY8wxfL6XQtpf7eZvEoGtwepQPBkwnQ1MjAELPDpKS2M+ejV5QIDAQAB
......
......@@ -9,8 +9,10 @@ payment.tourBaseNotifyUrl=http://112.65.124.86:18081/fun-common-soa/notify/tourO
payment.rechargeBaseNotifyUrl=http://112.65.124.86:18081/fun-common-soa/notify/rechargeOrder
payment.communeBaseNotifyUrl=http://112.65.124.86:18081/fun-common-soa/notify/communeOrder
payment.communeBaseNotifyUrlForMiniApp=http://112.65.124.86:18081/fun-common-soa/notify/notifyForMiniApp
payment.voucherNotifyUrlForMiniApp=http://112.65.124.86:18081/fun-common-soa/notify/notifyForVoucherMiniApp
payment.vipmemberBaseNotifyUrl=http://112.65.124.86:18081/fun-common-soa/notify/vipmemberOrder
payment.eventActivityBaseNotifyUrl=http://112.65.124.86:18081/fun-common-soa/notify/eventActivityOrder
payment.eventActivityBaseNotifyUrlForWeiXinPay=http://112.65.124.86:18081/fun-common-soa/notify/eventActivityOrder/notifyForWeiXinPay
payment.mallBaseNotifyUrl=http://112.65.124.86:18081/fun-common-soa/notify/mallOrder
#payment.privateKey=MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKpQrSAzyJV0MfBN7qKvE8d73phdredNhF3cKm3IWKFlCWg/3alVWI6GE462rPc5A4T+shYcvzqhV5wSOS0QMfj9VfLPqUT+xggFcCQ48mbeX4Jy/N5QZB3RZuQu+YbmQT6f54h2sJvhqLurvE7sgW4qL7r6AaJfDsvYPjKSezYXAgMBAAECgYA32EY8Jd6iarwpMFSMEV4p7craKPVpv3gkkply79tn6EpCXZaf/HUSHpJxHCLw2Uf3JtBcAccOQXMJoMwQo5vOoMVl5nk+EZN//MB8Re8r/7GQV8E+myHdlntMjxOf38PGn9z8Ze0Q020fZwGjA6egBFcU/ld1lCcI0TAj3cZDcQJBANS9UOC3J5njhnuzACjQ1qTTXuv6hr2lbglr2za4Ju9xFJUkKXy2LBAp2LlakXZXDhf7lsqmwZg5BvOBK6DPl18CQQDM8tqqOr4LRJRhq2bqBx398IqtyoZpMshpzBXLr7bdhp7FR2N4AEoAGaa5hS5k3z5SYNLEGKFhRM+sFJBQjnRJAkBnq647I+YffxotM8jTGxpOjlbGhnqc9n4OB0p3evw2WRPfrhStmpUUd2AOy4zxb3EFzOvp66OSC9BQX9Uj86XfAkEAouGbgVDgOupNFvZ2+yWe43Ppc0eS3UZ72wFUjSXgKlzUECu1VOi95yh7xdOf1JFL4YKL30dH8psShUtuimc86QJAeBXASabJBcHAIisPkODvsciiz1pzm1WSuXRUxnuis0TRTRs7+2KEnWE4UV3jxehxkc1RAgteYosWXg5TWQgiUg==
#payment.publicKey=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCdLrr1avVHbvsSfE2st2aBs1aQ0ZpHv9J/J3/iCCnHULBHgNOJC/a4bbwXr0yz3pmURDDJgaGtIL5qI27zPl43YZFPETRdu/lni9Re7NK81qgfP4ah+10afUmrhR3636Q9Lk77NxECfqvANVDiwuvw7/MfGKek97g8eN9grCAhWQIDAQAB
......
......@@ -9,8 +9,10 @@ payment.tourBaseNotifyUrl=http://10.8.55.46:8080/fun-common-soa/notify/tourOrder
payment.rechargeBaseNotifyUrl=http://10.8.55.46:8080/fun-common-soa/notify/rechargeOrder
payment.communeBaseNotifyUrl=http://10.8.55.46:8080/fun-common-soa/notify/communeOrder
payment.communeBaseNotifyUrlForMiniApp=http://10.8.55.46:8080/fun-common-soa/notify/notifyForMiniApp
payment.voucherNotifyUrlForMiniApp=http://10.8.55.46:8080/fun-common-soa/notify/notifyForVoucherMiniApp
payment.vipmemberBaseNotifyUrl=http://10.8.55.46:8080/fun-common-soa/notify/vipmemberOrder
payment.eventActivityBaseNotifyUrl=http://10.8.55.46:8080/fun-common-soa/notify/eventActivityOrder
payment.eventActivityBaseNotifyUrlForWeiXinPay=http://10.8.55.46:8080/fun-common-soa/notify/eventActivityOrder/notifyForWeiXinPay
payment.mallBaseNotifyUrl=http://10.8.55.46:8080/fun-common-soa/notify/mallOrder
#payment.privateKey=MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKpQrSAzyJV0MfBN7qKvE8d73phdredNhF3cKm3IWKFlCWg/3alVWI6GE462rPc5A4T+shYcvzqhV5wSOS0QMfj9VfLPqUT+xggFcCQ48mbeX4Jy/N5QZB3RZuQu+YbmQT6f54h2sJvhqLurvE7sgW4qL7r6AaJfDsvYPjKSezYXAgMBAAECgYA32EY8Jd6iarwpMFSMEV4p7craKPVpv3gkkply79tn6EpCXZaf/HUSHpJxHCLw2Uf3JtBcAccOQXMJoMwQo5vOoMVl5nk+EZN//MB8Re8r/7GQV8E+myHdlntMjxOf38PGn9z8Ze0Q020fZwGjA6egBFcU/ld1lCcI0TAj3cZDcQJBANS9UOC3J5njhnuzACjQ1qTTXuv6hr2lbglr2za4Ju9xFJUkKXy2LBAp2LlakXZXDhf7lsqmwZg5BvOBK6DPl18CQQDM8tqqOr4LRJRhq2bqBx398IqtyoZpMshpzBXLr7bdhp7FR2N4AEoAGaa5hS5k3z5SYNLEGKFhRM+sFJBQjnRJAkBnq647I+YffxotM8jTGxpOjlbGhnqc9n4OB0p3evw2WRPfrhStmpUUd2AOy4zxb3EFzOvp66OSC9BQX9Uj86XfAkEAouGbgVDgOupNFvZ2+yWe43Ppc0eS3UZ72wFUjSXgKlzUECu1VOi95yh7xdOf1JFL4YKL30dH8psShUtuimc86QJAeBXASabJBcHAIisPkODvsciiz1pzm1WSuXRUxnuis0TRTRs7+2KEnWE4UV3jxehxkc1RAgteYosWXg5TWQgiUg==
......
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 sign in to comment