Commit d53783a9 authored by jmdhappy's avatar jmdhappy
Browse files

初始化提交

parent 324ccaaf
package org.xxpay.shop.demo;
import com.alibaba.fastjson.JSONObject;
import org.xxpay.common.util.XXPayUtil;
/**
* Created by dingzhiwei on 16/5/5.
*/
public class MgrDemo {
// 商户ID
static final String baseUrl = "http://localhost:3000";
public static void main(String[] args) {
//addMchInfo();
addPayChannel();
}
// 统一下单
static void addMchInfo() {
JSONObject params = new JSONObject();
params.put("mchId", "20001226");
params.put("name", "百年树丁");
params.put("type", "1");
params.put("reqKey", "298332323231231313");
params.put("resKey", "883435353534543534");
String reqData = "params=" + params.toJSONString();
System.out.println("请求支付中心添加商户接口,请求数据:" + reqData);
String url = baseUrl + "/mch/add?";
String result = XXPayUtil.call4Post(url + reqData);
System.out.println("请求支付中心添加商户接口,响应数据:" + result);
}
// 统一下单
static void addPayChannel() {
JSONObject params = new JSONObject();
params.put("channelId", "WX_NATIVE");//WX_NATIVE
params.put("channelName", "WX");//WX
params.put("channelMchId", "1481721182");
params.put("mchId", "20001223");
// params.put("param", "{\"appid\": \"2016102302295125\", \"partner\": \"2088521108562983\", \"ali_account\": \"pay_vvlive@mail.51vv.com\", \"private_key\": \"MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKOuhY6LYZBMiRrvRw2s71CjPW7OPCvapjZdJJNPt5x471E3kDCb9A7kQTyqFIIVcUNKDlKRNztKBhhlxAiI7d95UkN5pAMK+XUItjyA9nj9cqK/ajHjwC4AlIRUZhlsPvj6lt1Oj1Kf1sNDJMM/NZL9IR8EXr7HlIsCjJNVHFPvAgMBAAECgYBY1S7G3f5lQiRm6dW2JlT7fpyotmURp+jtOD/Rc0JDOZ8ohO9McldSfa6qLeRTdS+zRU3goc9H7jTAqPprZ2UxNTUwJ4uMh+2bCtXkvUPwoWF4fb095xGtEUdbKMFkv+yKpCQASrjDhqzVq5xD/uc796wd7HOHwr8xPNOrKKSGAQJBANfgcaiIyFeo8KK4vIUWtqSiqLgG6gp7ABx2WpMWX3wsjbiCBQGVbJbnFcCkB+bofCuKYj7BGLjEEqc3c6y+Ph8CQQDCGprovroKw09dOzqFFPpkMrZvkOpO2e+RhDhhLYq2e5lRLVePtB/ZX2iy2yKQEp/7VWbNFzobqYR6KPXEH5AxAkBx3oD1XhkXLBSqMHm4Ve/HTcljMLp5BsJbQQ6rsUxyimnC3kpXuILL4l61+4/ze8Qrj1YdNeudYkdYjsZkYwEPAkBoWedIEylvmdqz86CdZU7LyVu9FPpyk8WwxJWO4O3+9unQ84BseFjbAukFprupGuo5M4uF3OPXdUYMarLd0l4xAkAMjec0KXp15a93I5y/vfIEAMQ+CQj/LwOxyAM6tTSPVGJHu70pXFQVWtwY+ycMuzbxTdSLuQYxITstHnV3mu76\", \"public_key\": \"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCjroWOi2GQTIka70cNrO9Qoz1uzjwr2qY2XSSTT7eceO9RN5Awm/QO5EE8qhSCFXFDSg5SkTc7SgYYZcQIiO3feVJDeaQDCvl1CLY8gPZ4/XKiv2ox48AuAJSEVGYZbD74pbdTo9Sn9bDQyTDPzWS/SEfBF6x5SLAoyTVRxT7wIDAQAB\"}");
//params.put("param", "{\"appid\": \"2016102302295125\", \"partner\": \"2088521108562983\", \"ali_account\": \"pay_vvlive@mail.51vv.com\", \"private_key\": \"MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKOuhY6LYZBMiRrvRw2s71CjPW7OPCvapjZdJJNPt5x471E3kDCb9A7kQTyqFIIVcUNKDlKRNztKBhhlxAiI7d95UkN5pAMK+XUItjyA9nj9cqK/ajHjwC4AlIRUZhlsPvj6lt1Oj1Kf1sNDJMM/NZL9IR8EXr7HlIsCjJNVHFPvAgMBAAECgYBY1S7G3f5lQiRm6dW2JlT7fpyotmURp+jtOD/Rc0JDOZ8ohO9McldSfa6qLeRTdS+zRU3goc9H7jTAqPprZ2UxNTUwJ4uMh+2bCtXkvUPwoWF4fb095xGtEUdbKMFkv+yKpCQASrjDhqzVq5xD/uc796wd7HOHwr8xPNOrKKSGAQJBANfgcaiIyFeo8KK4vIUWtqSiqLgG6gp7ABx2WpMWX3wsjbiCBQGVbJbnFcCkB+bofCuKYj7BGLjEEqc3c6y+Ph8CQQDCGprovroKw09dOzqFFPpkMrZvkOpO2e+RhDhhLYq2e5lRLVePtB/ZX2iy2yKQEp/7VWbNFzobqYR6KPXEH5AxAkBx3oD1XhkXLBSqMHm4Ve/HTcljMLp5BsJbQQ6rsUxyimnC3kpXuILL4l61+4/ze8Qrj1YdNeudYkdYjsZkYwEPAkBoWedIEylvmdqz86CdZU7LyVu9FPpyk8WwxJWO4O3+9unQ84BseFjbAukFprupGuo5M4uF3OPXdUYMarLd0l4xAkAMjec0KXp15a93I5y/vfIEAMQ+CQj/LwOxyAM6tTSPVGJHu70pXFQVWtwY+ycMuzbxTdSLuQYxITstHnV3mu76\", \"public_key\": \"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCjroWOi2GQTIka70cNrO9Qoz1uzjwr2qY2XSSTT7eceO9RN5Awm/QO5EE8qhSCFXFDSg5SkTc7SgYYZcQIiO3feVJDeaQDCvl1CLY8gPZ4/XKiv2ox48AuAJSEVGYZbD74+pbdTo9Sn9bDQyTDPzWS/SEfBF6+x5SLAoyTVRxT7wIDAQAB\"}");
params.put("param","{\"mchId\":\"1481721182\", \"appId\":\"wx077cb62e341f8a5c\", \"key\":\"50EBq9MJX5DNa39MZd8bc65TeFUyt6rM\", \"certLocalPath\":\"wx/1481721182_cert.p12\", \"certPassword\":\"1481721182\", \"desc\":\"xxpay_shop-native(xxpay扫码支付)\"}");
//params.put("param", "{\"mchId\":\"1366201502\", \"appId\":\"wx0ab67caf7f591834\", \"key\":\"zEBq9MJX5DNa39MZd8bc65TeFUyt6rkS\", \"certLocalPath\":\"wx/1366201502_cert.p12\", \"certPassword\":\"1366201502\", \"desc\":\"vvlive-jsapi(vv直播公众号)\"}");
params.put("remark", "微信扫码支付");
String reqData = "params=" + params.toJSONString();
System.out.println("请求支付中心添加渠道接口,请求数据:" + reqData);
String url = baseUrl + "/channel/add?";
String result = XXPayUtil.call4Post(url + reqData);
System.out.println("请求支付中心添加渠道接口,响应数据:" + result);
}
}
package org.xxpay.shop.demo;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.xxpay.common.util.PayDigestUtil;
import org.xxpay.common.util.XXPayUtil;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
/**
* Created by dingzhiwei on 16/5/5.
*/
public class PayOrderDemo {
// 商户ID
static final String mchId = "20001223";
// 项目ID
static final String payItemId = "7000001";
// 加签key
static final String reqKey = "M86l522AV6q613Ii4W6u8K48uW8vM1N6bFgyv769220MdYe9u37N4y7rI5mQ";
// 验签key
static final String repKey = "Hpcl522AV6q613KIi46u6g6XuW8vM1N8bFgyv769770MdYe9u37M4y7rIpl8";
static final String baseUrl = "http://localhost:3020/api";
public static void main(String[] args) {
String payOrderId = payOrderTest();
// String payOrderId = "pay2016120514591893319913549";
// if(payOrderId != null ) {
// queryOrderTest(payOrderId);
// //iapNotifyTest(payOrderId);
// }
//reissueOrder();
}
// 补单
static String reissueOrder() {
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("mchId", "0000010001"); // 商户ID
//pay2016110217365533065720596 易宝订单
//pay2016110710140585712982930 京东PC快捷
//pay2016110413295519324497135 支付宝wap
//pay2016110709341803399339691 微信
paramMap.put("payOrderId", "pay2016111514582547325887888");
String reqData = XXPayUtil.genUrlParams(paramMap);
System.out.println("请求支付中心补单接口,请求数据:" + reqData);
String url = baseUrl + "/pay/reissue_order.htm?";
String result = XXPayUtil.call4Post(url + reqData);
System.out.println("请求支付中心补单接口,响应数据:" + result);
Map retMap = JSON.parseObject(result);
if("SUCCESS".equals(retMap.get("retCode"))) {
System.out.println("=========支付中心补单验签成功=========");
}
return result;
}
// 统一下单
static String payOrderTest() {
JSONObject paramMap = new JSONObject();
paramMap.put("mchId", mchId); // 商户ID
paramMap.put("mchOrderNo", System.currentTimeMillis()); // 商户订单号
paramMap.put("channelId", "WX_NATIVE"); // 支付渠道ID, WX_NATIVE,ALIPAY_WAP
paramMap.put("amount", 1); // 支付金额,单位分
paramMap.put("currency", "cny"); // 币种, cny-人民币
paramMap.put("clientIp", "114.112.124.236"); // 用户地址,IP或手机号
paramMap.put("device", "WEB"); // 支付公司标识
paramMap.put("subject", "XXPAY支付测试");
paramMap.put("body", "XXPAY支付测试");
paramMap.put("notifyUrl", "http://baidu.com"); // 回调URL
//paramMap.put("notifyUrl", "http://xxpay.ngrok.cc/notify/pay/wxPayNotifyRes.htm");
paramMap.put("param1", ""); // 扩展参数1
paramMap.put("param2", ""); // 扩展参数2
paramMap.put("extra", "{\"productId\":\"120989823\",\"openId\":\"o2RvowBf7sOVJf8kJksUEMceaDqo\"}"); // 附加参数
String reqSign = PayDigestUtil.getSign(paramMap, reqKey);
paramMap.put("sign", reqSign); // 签名
String reqData = "params=" + paramMap.toJSONString();
System.out.println("请求支付中心下单接口,请求数据:" + reqData);
String url = baseUrl + "/pay/create_order?";
String result = XXPayUtil.call4Post(url + reqData);
System.out.println("请求支付中心下单接口,响应数据:" + result);
Map retMap = JSON.parseObject(result);
if("SUCCESS".equals(retMap.get("retCode"))) {
// 验签
String checkSign = PayDigestUtil.getSign(retMap, repKey, "sign", "payParams");
String retSign = (String) retMap.get("sign");
if(checkSign.equals(retSign)) {
System.out.println("=========支付中心下单验签成功=========");
}else {
System.err.println("=========支付中心下单验签失败=========");
return null;
}
}
return retMap.get("payOrderId")+"";
}
static void queryOrderTest(String payOrderId) {
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("mchId", mchId); // 商户ID
paramMap.put("payItemId", payItemId); // 业务项目ID
paramMap.put("rechargeId", "20160505000968"); // 业务系统流水号
paramMap.put("payOrderId", payOrderId); // 支付单号
String reqSign = PayDigestUtil.getSign(paramMap, reqKey);
paramMap.put("sign", reqSign); // 签名
String reqData = XXPayUtil.genUrlParams(paramMap);
System.out.println("请求支付中心查单接口,请求数据:" + reqData);
String url = baseUrl + "/pay/query_order.htm?";
String result = XXPayUtil.call4Post(url + reqData);
System.out.println("请求支付中心查单接口,响应数据:" + result);
Map retMap = JSON.parseObject(result); // fastJson速度更快
if("SUCCESS".equals(retMap.get("retCode"))) {
// 验签
String checkSign = PayDigestUtil.getSign(retMap, repKey, "sign");
String retSign = (String) retMap.get("sign");
if(checkSign.equals(retSign)) {
System.out.println("=========查询支付订单验签成功=========");
}else {
System.err.println("=========查询支付订单验签失败=========");
}
}
}
//
static void iapNotifyTest(String payOrderId) {
// "mchId", "payOrderId", "userId", "rechargeId", "receiptData", "transactionId", "sign"
Map<String, Object> paramMap = new HashMap<String, Object>();
String receiptData = "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";
paramMap.put("mchId", mchId); // 商户ID
paramMap.put("payOrderId", payOrderId); // 支付单号
paramMap.put("receiptData", receiptData);
paramMap.put("transactionId", "111"); // 苹果支付ID
paramMap.put("userId", 1984l); // 用户ID
String reqSign = PayDigestUtil.getSign(paramMap, reqKey);
paramMap.put("sign", reqSign); // 签名
try {
paramMap.put("receiptData", URLEncoder.encode(receiptData, "UTF-8")); // 苹果支付凭据
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String reqData = XXPayUtil.genUrlParams(paramMap);
System.out.println("请求支付中心苹果通知接口,请求数据:" + reqData);
String url = baseUrl + "/notify/iapPayNotifyRes.htm?";
String result = XXPayUtil.call4Post(url + reqData);
System.out.println("请求支付中心苹果通知接口,响应数据:" + result);
Map retMap = JSON.parseObject(result); // fastJson速度更快
if("SUCCESS".equals(retMap.get("retCode"))) {
// 验签
String checkSign = PayDigestUtil.getSign(retMap, repKey, "sign");
String retSign = (String) retMap.get("sign");
if(checkSign.equals(retSign)) {
System.out.println("=========苹果支付验证凭据验签成功=========");
}else {
System.err.println("=========苹果支付验证凭据验签失败=========");
}
}
}
static void iapNotifyTest2(String payOrderId) {
// "mchId", "payOrderId", "userId", "rechargeId", "receiptData", "transactionId", "sign"
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("mchId", mchId); // 商户ID
//paramMap.put("rechargeId", "20160505000968"); // 业务系统流水号
paramMap.put("payOrderId", payOrderId); // 支付单号
try {
paramMap.put("receiptData", URLEncoder.encode("abc+123", "UTF-8")); // 苹果支付凭据
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
paramMap.put("transactionId", ""); // 苹果支付ID
paramMap.put("userId", 1984l); // 用户ID
String reqSign = PayDigestUtil.getSign(paramMap, reqKey, "receiptData");
paramMap.put("sign", reqSign); // 签名
String reqData = XXPayUtil.genUrlParams(paramMap);
System.out.println("请求支付中心苹果通知接口,请求数据:" + reqData);
String url = "http://localhost:8088/h5/test.html?";
String result = XXPayUtil.call4Post(url + reqData);
System.out.println("请求支付中心苹果通知接口,响应数据:" + result);
Map retMap = JSON.parseObject(result); // fastJson速度更快
if("SUCCESS".equals(retMap.get("retCode"))) {
// 验签
String checkSign = PayDigestUtil.getSign(retMap, repKey, "sign");
String retSign = (String) retMap.get("sign");
if(checkSign.equals(retSign)) {
System.out.println("=========苹果支付验证凭据验签成功=========");
}else {
System.err.println("=========苹果支付验证凭据验签失败=========");
}
}
}
}
package org.xxpay.shop.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.xxpay.shop.dao.mapper.GoodsOrderMapper;
import org.xxpay.shop.dao.model.GoodsOrder;
import org.xxpay.shop.dao.model.GoodsOrderExample;
import org.xxpay.shop.util.Constant;
/**
* Created by dingzhiwei on 17/6/2.
*/
@Component
public class GoodsOrderService {
@Autowired
private GoodsOrderMapper goodsOrderMapper;
/*
`Status` tinyint(6) NOT NULL DEFAULT '0' COMMENT '订单状态,订单生成(0),支付成功(1),处理完成(2),处理失败(-1)',
*/
public int addGoodsOrder(GoodsOrder goodsOrder) {
return goodsOrderMapper.insertSelective(goodsOrder);
}
public GoodsOrder getGoodsOrder(String goodsOrderId) {
return goodsOrderMapper.selectByPrimaryKey(goodsOrderId);
}
public int updateStatus4Success(String goodsOrderId) {
GoodsOrder goodsOrder = new GoodsOrder();
goodsOrder.setStatus(Constant.GOODS_ORDER_STATUS_SUCCESS);
GoodsOrderExample example = new GoodsOrderExample();
GoodsOrderExample.Criteria criteria = example.createCriteria();
criteria.andGoodsOrderIdEqualTo(goodsOrderId);
criteria.andStatusEqualTo(Constant.GOODS_ORDER_STATUS_INIT);
return goodsOrderMapper.updateByExampleSelective(goodsOrder, example);
}
public int updateStatus4Complete(String goodsOrderId) {
GoodsOrder goodsOrder = new GoodsOrder();
goodsOrder.setStatus(Constant.GOODS_ORDER_STATUS_COMPLETE);
GoodsOrderExample example = new GoodsOrderExample();
GoodsOrderExample.Criteria criteria = example.createCriteria();
criteria.andGoodsOrderIdEqualTo(goodsOrderId);
criteria.andStatusEqualTo(Constant.GOODS_ORDER_STATUS_SUCCESS);
return goodsOrderMapper.updateByExampleSelective(goodsOrder, example);
}
public int updateStatus4Fail(String goodsOrderId) {
GoodsOrder goodsOrder = new GoodsOrder();
goodsOrder.setStatus(Constant.GOODS_ORDER_STATUS_FAIL);
GoodsOrderExample example = new GoodsOrderExample();
GoodsOrderExample.Criteria criteria = example.createCriteria();
criteria.andGoodsOrderIdEqualTo(goodsOrderId);
//criteria.andStatusEqualTo(Constant.GOODS_ORDER_STATUS_SUCCESS);
return goodsOrderMapper.updateByExampleSelective(goodsOrder, example);
}
public int update(GoodsOrder goodsOrder) {
return goodsOrderMapper.updateByPrimaryKeySelective(goodsOrder);
}
}
package org.xxpay.shop.util;
import java.text.ParseException;
import java.util.*;
/**
* 日期工具类
* @author Brain
*/
public class CalendarUtil {
public static final String YEAR = "year";
public static final String MONTH = "month";
public static final String MONTH_FIRST_DAY_TIME = "month_first_day_time";
public static final String MONTH_LAST_DAY_TIME = "month_last_day_time";
//获取当前年的前5年数据
public static List<String> getPre5Years(){
List<String> years = new ArrayList<String>();
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
for(int i = 0; i < 5; i++){
years.add((year - i) + "");
}
return years;
}
//获取12个月的数据
public static List<String> get12MonthStr(){
List<String> months = new ArrayList<String>();
for(int i = 1 ;i < 13 ;i++){
months.add(i+"");
}
return months;
}
//获取当前明天的数据
public static String getNextDay(String format){
Calendar calendar = Calendar.getInstance();
Calendar tmpCalendar = Calendar.getInstance();
tmpCalendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));//设置本月最大日期
int maxDate = tmpCalendar.get(Calendar.DATE);
int month = calendar.get(Calendar.MONTH);
int year = calendar.get(Calendar.YEAR);
int date = calendar.get(Calendar.DATE);
if(date + 1 > maxDate ){
if(month + 1 > 11){
calendar.add(Calendar.YEAR, 1);
calendar.set(Calendar.MONTH, 0);
calendar.set(Calendar.DATE, 1);
}else{
calendar.set(year, month, date+1);
}
}else{
calendar.set(year, month, date+1);
}
return DateUtil.getDateText(calendar.getTime(), format);
}
//获取n天后的日期
public static Date getNextNDay(Date startTime,Integer n){
Calendar start = Calendar.getInstance();
start.setTime(startTime);
start.add(Calendar.DATE, n);
return start.getTime();
}
//获取n天后的日期 00:00:00
public static Date getNextNDayBegin(Date startTime,Integer n){
Calendar start = Calendar.getInstance();
start.setTime(startTime);
start.add(Calendar.DATE, n);
start.set(Calendar.HOUR_OF_DAY, 0);
start.set(Calendar.MINUTE, 0);
start.set(Calendar.SECOND, 0);
return start.getTime();
}
//获取n天后的日期 23:59:59
public static Date getNextNDayEnd(Date startTime,Integer n){
Calendar start = Calendar.getInstance();
start.setTime(startTime);
start.add(Calendar.DATE, n);
start.set(Calendar.HOUR_OF_DAY, 23);
start.set(Calendar.MINUTE, 59);
start.set(Calendar.SECOND, 59);
return start.getTime();
}
//获取n天前的日期
public static Date getPreNDay(Date startTime,Integer n){
Calendar start = Calendar.getInstance();
start.setTime(startTime);
start.add(Calendar.DATE, -n);
return start.getTime();
}
//获取n天前的日期 00:00:00
public static Date getPreNDayBegin(Date startTime,Integer n){
Calendar start = Calendar.getInstance();
start.setTime(startTime);
start.add(Calendar.DATE, -n);
start.set(Calendar.HOUR_OF_DAY, 0);
start.set(Calendar.MINUTE, 0);
start.set(Calendar.SECOND, 0);
return start.getTime();
}
//获取n天前的日期 23:59:59
public static Date getPreNDayEnd(Date startTime,Integer n){
Calendar start = Calendar.getInstance();
start.setTime(startTime);
start.add(Calendar.DATE, -n);
start.set(Calendar.HOUR_OF_DAY, 23);
start.set(Calendar.MINUTE, 59);
start.set(Calendar.SECOND, 59);
return start.getTime();
}
//获取前x天的数据, x < 10;
public static String getPreXDay(int x ,String format){
Calendar calendar = Calendar.getInstance();
int month = calendar.get(Calendar.MONTH);
int year = calendar.get(Calendar.YEAR);
int date = calendar.get(Calendar.DATE);
if(date - x < 0 ){
if(month - 1 < 0){
calendar.add(Calendar.YEAR, -1);
calendar.set(Calendar.MONTH, 11);
calendar.set(Calendar.DATE, 31 - (x-date));
}else{
calendar.add(Calendar.MONTH, -1);
calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));//设置本月最大日期
int maxDate = calendar.get(Calendar.DATE);
calendar.set(year, month - 1, maxDate - (x-date));
}
}else{
calendar.set(year, month, date - x);
}
return DateUtil.getDateText(calendar.getTime(), format);
}
//获取当前年
public static String getYear(){
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
return year+"";
}
//获取当前月
public static String getMonth(){
Calendar calendar = Calendar.getInstance();
int month = calendar.get(Calendar.MONTH);
month = month + 1;
if(month > 12){
return "12";
}
return month+"";
}
//获取 年-月的 第一天 和 最后一天 时间
public static Map<String,String> getMonthFirstEndDayTime(String year,String month){
Map<String,String> rst = new HashMap<String,String>();
Calendar calendar = Calendar.getInstance();
int m = Integer.parseInt(month);
m = m - 1;
if(m < 0){
m = 0;
}
calendar.set(Integer.parseInt(year), m, 1);
String firstDayTime = DateUtil.COMMON.getDateText(calendar.getTime()) +" 00:00:00";
calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));//设置本月最大日期
String lastDayTime = DateUtil.COMMON.getDateText(calendar.getTime()) +" 23:59:59";
rst.put(CalendarUtil.MONTH_FIRST_DAY_TIME, firstDayTime);
rst.put(CalendarUtil.MONTH_LAST_DAY_TIME, lastDayTime);
return rst;
}
//获取前一个月
public static Map<String,String> getPreMonth(){
Map<String,String> rst = new HashMap<String,String>();
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MONTH, -1);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
month = month + 1;
rst.put("year", year+"");
if(month > 12){
rst.put("month", "12");
}else{
rst.put("month", month+"");
}
return rst;
}
//获取前一个月
public static Map<String,String> getPreMonth(Integer year,Integer month){
Map<String,String> rst = new HashMap<String,String>();
if(month == 1){
rst.put("year", (year-1)+"");
rst.put("month", "12");
}else{
rst.put("year", year+"");
rst.put("month", (month-1)+"");
}
return rst;
}
//获取开始月份和结束月份中间的所有月份,包括开始月份和结束月份
public static List<String> getBetweenMonths(String startMonth ,String endMonth){
String[] startArr = startMonth.split("-");
String[] endArr = endMonth.split("-");
Integer startY = Integer.parseInt(startArr[0]);
Integer startM = Integer.parseInt(startArr[1]);
Integer endY = Integer.parseInt(endArr[0]);
Integer endM = Integer.parseInt(endArr[1]);
Calendar startCalendar = Calendar.getInstance();
startCalendar.set(startY, startM - 1, 1, 0, 0);
Calendar endCalendar = Calendar.getInstance();
endCalendar.set(endY, endM - 1, 1, 0, 0);
List<String> months = new ArrayList<String>();
while(startCalendar.getTimeInMillis() <= endCalendar.getTimeInMillis()){
months.add(DateUtil.getDateText(startCalendar.getTime(),"yyyy-MM"));
startCalendar.add(Calendar.MONTH, 1);
}
return months;
}
//获取日期之间的天List formt = "yyyy-MM-dd"
public static List<String> getBetweenDateStr(String startTime,String endTime){
List<String> dateList = new ArrayList<String>();
try {
Long startM = DateUtil.COMMON.getTextDate(startTime).getTime();
Long endM = DateUtil.COMMON.getTextDate(endTime).getTime();
long result = (endM-startM) / (24 * 60 * 60*1000);
String[] startTimeStr = startTime.split("-");
Calendar startCalendar = Calendar.getInstance();
startCalendar.set(Integer.parseInt(startTimeStr[0]), Integer.parseInt(startTimeStr[1]) - 1, Integer.parseInt(startTimeStr[2]));
startCalendar.add(Calendar.DATE,-1);
for(int i = 0; i <= result ; i++){
startCalendar.add(Calendar.DATE,1);
dateList.add(DateUtil.COMMON.getDateText(startCalendar.getTime()));
}
} catch (ParseException e) {
e.printStackTrace();
}
return dateList;
}
public static List<String> getBetweenDateStr(String startTime,String endTime,String format){
List<String> dateList = new ArrayList<String>();
try {
Long startM = DateUtil.COMMON.getTextDate(startTime).getTime();
Long endM = DateUtil.COMMON.getTextDate(endTime).getTime();
long result = (endM-startM) / (24 * 60 * 60*1000);
String[] startTimeStr = startTime.split("-");
Calendar startCalendar = Calendar.getInstance();
startCalendar.set(Integer.parseInt(startTimeStr[0]), Integer.parseInt(startTimeStr[1]) - 1, Integer.parseInt(startTimeStr[2]));
startCalendar.add(Calendar.DATE,-1);
for(int i = 0; i <= result ; i++){
startCalendar.add(Calendar.DATE,1);
dateList.add(DateUtil.getDateText(startCalendar.getTime(),format));
}
} catch (ParseException e) {
e.printStackTrace();
}
return dateList;
}
//获取日期的前n个月的月份(闭区间)
public static List<String> getPreNMonths(String curMonth ,Integer n){
String[] curArr = curMonth.split("-");
Integer curY = Integer.parseInt(curArr[0]);
Integer curM = Integer.parseInt(curArr[1]);
Calendar curCalendar = Calendar.getInstance();
curCalendar.set(curY, curM - 1, 1, 0, 0);
Calendar tmpCalendar = Calendar.getInstance();
tmpCalendar.set(curY, curM - 1 - n, 1, 0, 0);
List<String> months = new ArrayList<String>();
while(tmpCalendar.getTimeInMillis() <= curCalendar.getTimeInMillis()){
months.add(DateUtil.getDateText(tmpCalendar.getTime(),"yyyy-MM"));
tmpCalendar.add(Calendar.MONTH, 1);
}
return months;
}
//获取当前天
public static String getToday(String format){
Calendar calendar = Calendar.getInstance();
return DateUtil.getDateText(calendar.getTime(), format);
}
//获取当前月的第一天
public static String getFirstDay(String format){
Calendar calendar = Calendar.getInstance();
int month = calendar.get(Calendar.MONTH);
int year = calendar.get(Calendar.YEAR);
calendar.set(year, month, 1);
return DateUtil.getDateText(calendar.getTime(), format);
}
//获取当前月的最后一天
public static String getLastDay(String format){
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));//设置本月最大日期
return DateUtil.getDateText(calendar.getTime(), format);
}
//获取当前月的第一天
public static Date getFirstDate(){
Calendar calendar = Calendar.getInstance();
int month = calendar.get(Calendar.MONTH);
int year = calendar.get(Calendar.YEAR);
calendar.set(year, month, 1);
return calendar.getTime();
}
//获取当前月的最后一天
public static Date getLastDate(){
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));//设置本月最大日期
return calendar.getTime();
}
//日期的天是否一样;
public static boolean isDayEqual(Date date1,Date date2){
if(date1==null || date2 == null){
return false;
}
String date1Str = DateUtil.COMPAT.getDateText(date1);
String date2Str = DateUtil.COMPAT.getDateText(date2);
return date1Str.equals(date2Str);
}
/**
* 时间间距是否为xx;
* 如果在 space 之内返回true;否则返回false
* @param startTime 开始时间
* @param endTime 结束时间
* @param space 毫秒
* @return
*/
public static boolean isTimeSpace(Date startTime,Date endTime,long space){
if (startTime == null || endTime == null) {
return false;
}
return endTime.getTime() - startTime.getTime() <= space;
}
/**
* 时间间距是否在 startSpace 和 endSpace 之间
* @param startTime
* @param endTime
* @param startSpace
* @param endSpace
* @return
*/
public static boolean isTimeBetween(Date startTime,Date endTime,long startSpace,long endSpace){
return endTime.getTime() - startTime.getTime() <= endSpace &&
endTime.getTime() - startTime.getTime() >= startSpace;
}
public static boolean isTimeBetween(Date time,Date startTime,Date endTime){
return time.getTime() >= startTime.getTime() && time.getTime() <= endTime.getTime();
}
//获取日期之间年的距离
public static Integer getYearSpace(Date startTime,Date endTime){
Calendar start = Calendar.getInstance();
start.setTime(startTime);
Calendar end = Calendar.getInstance();
end.setTime(endTime);
return end.get(Calendar.YEAR) - start.get(Calendar.YEAR);
}
//获取日期之间天的距离
public static Integer getDaySpace(Date startTime,Date endTime){
return (int)(endTime.getTime() - startTime.getTime())/(24*60*60*1000);
}
//获取当前日期 毫秒
public static long getTimeInMillis(){
Calendar now = Calendar.getInstance();
return now.getTimeInMillis();
}
//获取当前日期 秒
public static long getTimeInSeconds(){
return getTimeInMillis()/1000L;
}
public static void main(String[] args){
/*String startTime = "2009-12-14";
String endTime = "2010-1-14";
List<String> list = getBetweenDateStr(startTime,endTime);
for(String s : list){
System.out.println(s);
}*/
/*String nextday = getNextDay("yyyy-MM-dd");
String xday = getPreXDay(6,"yyyy-MM-dd");
System.out.println(nextday);
System.out.println(xday);
System.out.println(getFirstDay("yyyy-MM-dd"));
System.out.println(getLastDay("yyyy-MM-dd"));*/
try {
Date startTime = DateUtil.COMMON.getTextDate("2015-06-03 00:00:00");
Date endTime = DateUtil.COMMON_FULL.getTextDate("2015-06-03 23:59:59");
System.out.println(isTimeBetween(new Date(),startTime,endTime));
List<String> month = getPreNMonths("2015-06",11);
for(String s : month){
System.out.println(s);
}
String str = DateUtil.COMMON_FULL.getDateText(getPreNDayEnd(new Date(),1));
System.out.println(str);
List<String> days = getBetweenDateStr("2015-03-09","2015-06-15","MM/dd");
for(String s : days){
System.out.println(s);
}
} catch (ParseException e) {
e.printStackTrace();
}
}
}
package org.xxpay.shop.util;
/**
* Created by dingzhiwei on 17/6/2.
*/
public class Constant {
public static final Byte GOODS_ORDER_STATUS_INIT = 0;
public static final Byte GOODS_ORDER_STATUS_SUCCESS = 1;
public static final Byte GOODS_ORDER_STATUS_COMPLETE = 2;
public static final Byte GOODS_ORDER_STATUS_FAIL = -1;
}
package org.xxpay.shop.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
*
* 日期工具类
*
*/
public class DateUtil {
private final SimpleDateFormat format;
public DateUtil(SimpleDateFormat format) {
this.format = format;
}
public SimpleDateFormat getFormat() {
return format;
}
//紧凑型日期格式,也就是纯数字类型yyyyMMdd
public static final DateUtil COMPAT = new DateUtil(new SimpleDateFormat("yyyyMMdd"));
//常用日期格式,yyyy-MM-dd
public static final DateUtil COMMON = new DateUtil(new SimpleDateFormat("yyyy-MM-dd"));
public static final DateUtil COMMON_FULL = new DateUtil(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
//使用斜线分隔的,西方多采用,yyyy/MM/dd
public static final DateUtil SLASH = new DateUtil(new SimpleDateFormat("yyyy/MM/dd"));
//中文日期格式常用,yyyy年MM月dd日
public static final DateUtil CHINESE = new DateUtil(new SimpleDateFormat("yyyy年MM月dd日"));
public static final DateUtil CHINESE_FULL = new DateUtil(new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒"));
/**
* 日期获取字符串
*/
public String getDateText(Date date){
return getFormat().format(date);
}
/**
* 字符串获取日期
* @throws ParseException
*/
public Date getTextDate(String text) throws ParseException{
return getFormat().parse(text);
}
/**
* 日期获取字符串
*/
public static String getDateText(Date date ,String format){
return new SimpleDateFormat(format).format(date);
}
/**
* 字符串获取日期
* @throws ParseException
*/
public static Date getTextDate(String dateText ,String format) throws ParseException{
return new SimpleDateFormat(format).parse(dateText);
}
/**
* 根据日期,返回其星期数,周一为1,周日为7
* @param date
* @return
*/
public static int getWeekDay(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int w = calendar.get(Calendar.DAY_OF_WEEK);
int ret;
if (w == Calendar.SUNDAY)
ret = 7;
else
ret = w - 1;
return ret;
}
public static String getSeqString() {
SimpleDateFormat fm = new SimpleDateFormat("yyyyMMddHHmmss");
return fm.format(new Date());
}
}
package org.xxpay.shop.util;
import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
/**
* 微信oauth interceptor 处理参数转换;
* 对于interceptor的url如果有参数,业务中请用此类获取参数;
*/
public class OAuth2RequestParamHelper {
//准备state参数
public static String prepareState(HttpServletRequest request){
Map<String, String[]> map = request.getParameterMap();
StringBuilder sb = new StringBuilder("");
for(String key : map.keySet()){
if(map.get(key) != null && map.get(key).length > 0){
if(map.get(key)[0] != null){
sb.append(key+"="+map.get(key)[0]+"!");//用!间隔
}
}
}
String str = sb.toString();
if(StringUtils.isBlank(str)){
return "";
}else{
return str.substring(0, str.length() - 1);
}
}
//获取state参数map
public static Map<String,String> getStateParam(HttpServletRequest request){
String state = request.getParameter("state");
String[] stateArr = state.split("!");//用!间隔
Map<String,String> param = new HashMap<String,String>();
if(stateArr != null && stateArr.length > 0){
for(String s : stateArr){
String key = s.split("=")[0];
String value = s.split("=")[1];
param.put(key, value);
}
}
return param;
}
/**
* 根据key获取;如果有state,从state中获取;否则从request中获取
* @param request
* @param name
* @return
*/
public static String getParameter(HttpServletRequest request, String name){
String state = request.getParameter("state");
if(state != null){
String[] stateArr = state.split("!");//用!间隔
if(stateArr != null && stateArr.length > 0){
for(String s : stateArr){
String key = s.split("=")[0];
String value = s.split("=")[1];
if(name.equals(key)){
return value;
}
}
}
return null;
}else{
return request.getParameter(name);
}
}
}
package org.xxpay.shop.util.vx;
import org.xxpay.shop.util.CalendarUtil;
public class AccessToken {
private String accessToken;// 接口访问凭证
private int expiresIn;// 凭证有效期,单位:秒
private long createTime;//创建时间,单位:秒 ,用于判断是否过期
private Integer errcode;//错误编码
private String errmsg;//错误消息
public AccessToken(){
this.createTime = CalendarUtil.getTimeInSeconds();
}
public AccessToken(String accessToken, int expiresIn){
this.accessToken = accessToken;
this.expiresIn = expiresIn;
this.createTime = CalendarUtil.getTimeInSeconds();
}
public long getCreateTime() {
return createTime;
}
public void setCreateTime(long createTime) {
this.createTime = createTime;
}
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
public int getExpiresIn() {
return expiresIn;
}
public void setExpiresIn(int expiresIn) {
this.expiresIn = expiresIn;
}
public Integer getErrcode() {
return errcode;
}
public void setErrcode(Integer errcode) {
this.errcode = errcode;
this.errmsg = ErrCode.errMsg(errcode);
}
public String getErrmsg() {
return errmsg;
}
public void setErrmsg(String errmsg) {
this.errmsg = errmsg;
}
/**
* 是否超时,微信默认7200s超时
* @return true-超时;false-没有超时
*/
public boolean isExpires(){
long now = CalendarUtil.getTimeInSeconds();
return now - this.createTime - 10 >= this.expiresIn; //预留 10s
}
/**
* 是否超时
* @return true-超时;false-没有超时
*/
public boolean isExpires(Long expireTime){
long now = CalendarUtil.getTimeInSeconds();
return now - this.createTime - 10 >= expireTime; //预留 10s
}
}
package org.xxpay.shop.util.vx;
import java.util.HashMap;
import java.util.Map;
/**
* 微信公众平台全局返回码说明
*/
public class ErrCode {
private static Map<String,String> codeMap = new HashMap<String,String>();
static {
codeMap.put("-1","系统繁忙");
codeMap.put("0","请求成功");
codeMap.put("40001","获取access_token时AppSecret错误,或者access_token无效");
codeMap.put("40002","不合法的凭证类型");
codeMap.put("40003","不合法的OpenID");
codeMap.put("40004","不合法的媒体文件类型");
codeMap.put("40005","不合法的文件类型");
codeMap.put("40006","不合法的文件大小");
codeMap.put("40007","不合法的媒体文件id");
codeMap.put("40008","不合法的消息类型");
codeMap.put("40009","不合法的图片文件大小");
codeMap.put("40010","不合法的语音文件大小");
codeMap.put("40011","不合法的视频文件大小");
codeMap.put("40012","不合法的缩略图文件大小");
codeMap.put("40013","不合法的APPID");
codeMap.put("40014","不合法的access_token");
codeMap.put("40015","不合法的菜单类型");
codeMap.put("40016","不合法的按钮个数");
codeMap.put("40017","不合法的按钮个数");
codeMap.put("40018","不合法的按钮名字长度");
codeMap.put("40019","不合法的按钮KEY长度");
codeMap.put("40020","不合法的按钮URL长度");
codeMap.put("40021","不合法的菜单版本号");
codeMap.put("40022","不合法的子菜单级数");
codeMap.put("40023","不合法的子菜单按钮个数");
codeMap.put("40024","不合法的子菜单按钮类型");
codeMap.put("40025","不合法的子菜单按钮名字长度");
codeMap.put("40026","不合法的子菜单按钮KEY长度");
codeMap.put("40027","不合法的子菜单按钮URL长度");
codeMap.put("40028","不合法的自定义菜单使用用户");
codeMap.put("40029","不合法的oauth_code");
codeMap.put("40030","不合法的refresh_token");
codeMap.put("40031","不合法的openid列表");
codeMap.put("40032","不合法的openid列表长度");
codeMap.put("40033","不合法的请求字符,不能包含\\uxxxx格式的字符");
codeMap.put("40035","不合法的参数");
codeMap.put("40038","不合法的请求格式");
codeMap.put("40039","不合法的URL长度");
codeMap.put("40050","不合法的分组id");
codeMap.put("40051","分组名字不合法");
codeMap.put("41001","缺少access_token参数");
codeMap.put("41002","缺少appid参数");
codeMap.put("41003","缺少refresh_token参数");
codeMap.put("41004","缺少secret参数");
codeMap.put("41005","缺少多媒体文件数据");
codeMap.put("41006","缺少media_id参数");
codeMap.put("41007","缺少子菜单数据");
codeMap.put("41008","缺少oauth code");
codeMap.put("41009","缺少openid");
codeMap.put("42001","access_token超时");
codeMap.put("42002","refresh_token超时");
codeMap.put("42003","oauth_code超时");
codeMap.put("43001","需要GET请求");
codeMap.put("43002","需要POST请求");
codeMap.put("43003","需要HTTPS请求");
codeMap.put("43004","需要接收者关注");
codeMap.put("43005","需要好友关系");
codeMap.put("44001","多媒体文件为空");
codeMap.put("44002","POST的数据包为空");
codeMap.put("44003","图文消息内容为空");
codeMap.put("44004","文本消息内容为空");
codeMap.put("45001","多媒体文件大小超过限制");
codeMap.put("45002","消息内容超过限制");
codeMap.put("45003","标题字段超过限制");
codeMap.put("45004","描述字段超过限制");
codeMap.put("45005","链接字段超过限制");
codeMap.put("45006","图片链接字段超过限制");
codeMap.put("45007","语音播放时间超过限制");
codeMap.put("45008","图文消息超过限制");
codeMap.put("45009","接口调用超过限制");
codeMap.put("45010","创建菜单个数超过限制");
codeMap.put("45015","回复时间超过限制");
codeMap.put("45016","系统分组,不允许修改");
codeMap.put("45017","分组名字过长");
codeMap.put("45018","分组数量超过上限");
codeMap.put("46001","不存在媒体数据");
codeMap.put("46002","不存在的菜单版本");
codeMap.put("46003","不存在的菜单数据");
codeMap.put("46004","不存在的用户");
codeMap.put("47001","解析JSON/XML内容错误");
codeMap.put("48001","api功能未授权");
codeMap.put("50001","用户未授权该api");
codeMap.put("61451","参数错误(invalid parameter)");
codeMap.put("61452","无效客服账号(invalid kf_account)");
codeMap.put("61453","客服帐号已存在(kf_account exsited)");
codeMap.put("61454","客服帐号名长度超过限制(仅允许10个英文字符,不包括@及@后的公众号的微信号)(invalid kf_acount length)");
codeMap.put("61455","客服帐号名包含非法字符(仅允许英文+数字)(illegal character in kf_account)");
codeMap.put("61456","客服帐号个数超过限制(10个客服账号)(kf_account count exceeded)");
codeMap.put("61457","无效头像文件类型(invalid file type)");
codeMap.put("61450","系统错误(system error)");
codeMap.put("61500","日期格式错误");
codeMap.put("61501","日期范围错误");
}
public static String errMsg(Integer errCode){
if(errCode != null && codeMap.containsKey(errCode+"")){
return codeMap.get(errCode+"");
}
return null;
}
}
package org.xxpay.shop.util.vx;
/**
*
*/
public class HttpMethod {
public static final String POST = "POST";
public static final String GET = "GET";
}
package org.xxpay.shop.util.vx;
import org.xxpay.shop.util.CalendarUtil;
/**
* 接口凭证
*/
public class JSTicket {
private String ticket;// 接口访问凭证
private int expiresIn;// 凭证有效期,单位:秒
private long createTime;//创建时间,单位:秒 ,用于判断是否过期
private Integer errcode;//错误编码
private String errmsg;//错误消息
public JSTicket(){
this.createTime = CalendarUtil.getTimeInSeconds();
}
public JSTicket(String ticket, int expiresIn){
this.ticket = ticket;
this.expiresIn = expiresIn;
this.createTime = CalendarUtil.getTimeInSeconds();
}
public String getTicket() {
return ticket;
}
public void setTicket(String ticket) {
this.ticket = ticket;
}
public int getExpiresIn() {
return expiresIn;
}
public void setExpiresIn(int expiresIn) {
this.expiresIn = expiresIn;
}
public Integer getErrcode() {
return errcode;
}
public void setErrcode(Integer errcode) {
this.errcode = errcode;
this.errmsg = ErrCode.errMsg(errcode);
}
public String getErrmsg() {
return errmsg;
}
public void setErrmsg(String errmsg) {
this.errmsg = errmsg;
}
/**
* 是否超时
* @return true-超时;false-没有超时
*/
public boolean isExpires(){
long now = CalendarUtil.getTimeInSeconds();
return now - this.createTime - 10 >= this.expiresIn; //预留 10s
}
/**
* 是否超时
* @return true-超时;false-没有超时
*/
public boolean isExpires(Long expireTime){
long now = CalendarUtil.getTimeInSeconds();
return now - this.createTime - 10 >= expireTime; //预留 10s
}
}
package org.xxpay.shop.util.vx;
import java.io.Serializable;
/**
* 微信公众号信息
*/
public class MpAccount implements Serializable{
private static final long serialVersionUID = -6315146640254918207L;
private String account;//账号
private String appid;//appid
private String appsecret;//appsecret
private String url;//验证时用的url
private String token;//token
//ext
private Integer msgcount;//自动回复消息条数;默认是5条
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getAppid() {
return appid;
}
public void setAppid(String appid) {
this.appid = appid;
}
public String getAppsecret() {
return appsecret;
}
public void setAppsecret(String appsecret) {
this.appsecret = appsecret;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public Integer getMsgcount() {
if(msgcount == null)
msgcount = 5;//默认5条
return msgcount;
}
public void setMsgcount(Integer msgcount) {
this.msgcount = msgcount;
}
}
package org.xxpay.shop.util.vx;
/**
* OAuth token
*/
public class OAuthAccessToken extends AccessToken {
//oauth2.0
private String oauthAccessToken;//刷新token
private String openid;
private String scope;
public String getOauthAccessToken() {
return oauthAccessToken;
}
public void setOauthAccessToken(String oauthAccessToken) {
this.oauthAccessToken = oauthAccessToken;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public String getScope() {
return scope;
}
public void setScope(String scope) {
this.scope = scope;
}
}
package org.xxpay.shop.util.vx;
import com.alibaba.fastjson.JSONObject;
import java.util.Map;
/**
* 发送的模板消息对象
*/
public class TemplateMessage {
private String openid;//粉丝id
private String templateId;//模板id
private String url;//链接
private String color = "#173177";//颜色
private Map<String,String> dataMap;//参数数据
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public String getTemplateId() {
return templateId;
}
public void setTemplateId(String templateId) {
this.templateId = templateId;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Map<String, String> getDataMap() {
return dataMap;
}
public void setDataMap(Map<String, String> dataMap) {
this.dataMap = dataMap;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@Override
public String toString(){
JSONObject jsObj = new JSONObject();
jsObj.put("touser", openid);
jsObj.put("template_id", templateId);
jsObj.put("url", url);
JSONObject data = new JSONObject();
if(dataMap != null){
for(String key : dataMap.keySet()){
JSONObject item = new JSONObject();
item.put("value", dataMap.get(key));
item.put("color", color);
data.put(key,item);
}
}
jsObj.put("data", data);
return jsObj.toString();
}
}
package org.xxpay.shop.util.vx;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import org.xxpay.common.util.MyLog;
import javax.net.ssl.*;
import java.io.*;
import java.net.URL;
import java.net.URLEncoder;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
/**
* 微信 API、微信基本接口
*
*/
public class WxApi {
private static final MyLog _log = MyLog.getLog(WxApi.class);
//token 接口
private static final String TOKEN = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";
//创建菜单
private static final String MENU_CREATE = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=%s";
//创建个性化菜单
private static final String MENU_ADDCONDITIONAL = "https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token=%s";
//删除菜单
private static final String MENU_DELETE = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=%s";
//获取账号粉丝信息
private static final String GET_FANS_INFO = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s&lang=zh_CN";
//获取账号粉丝列表
private static final String GET_FANS_LIST = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=%s";
//获取批量素材
private static final String GET_BATCH_MATERIAL = "https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=%s";
//上传多媒体资料接口
private static final String UPLOAD_MEDIA = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=%s&type=%s";
//上传永久素材:图文
private static final String UPLOAD_NEWS = "https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=%s";
//群发接口
private static final String MASS_SEND = "https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=%s";
//网页授权OAuth2.0获取code
private static final String GET_OAUTH_CODE = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=%s&scope=%s&state=%s#wechat_redirect";
//网页授权OAuth2.0获取token
private static final String GET_OAUTH_TOKEN = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code";
//网页授权OAuth2.0获取用户信息
private static final String GET_OAUTH_USERINFO = "https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN";
//生成二维码
private static final String CREATE_QRCODE = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=%s";
//根据ticket获取二维码图片
private static final String SHOW_QRCODE = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=%s";
//js ticket
private static final String GET_JSAPI_TICKET="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi";
//发送客服消息
private static final String SEND_CUSTOM_MESSAGE = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=%s";
//模板消息接口
private static final String SEND_TEMPLATE_MESSAGE = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=%s";
//获取token接口
public static String getTokenUrl(String appId,String appSecret){
return String.format(TOKEN, appId, appSecret);
}
//获取上传Media接口
public static String getUploadMediaUrl(String token,String type){
return String.format(UPLOAD_MEDIA, token, type);
}
//获取菜单创建接口
public static String getMenuCreateUrl(String token){
return String.format(MENU_CREATE, token);
}
//获取个性化菜单创建接口
public static String getMenuAddconditionalUrl(String token){
return String.format(MENU_ADDCONDITIONAL, token);
}
//获取菜单删除接口
public static String getMenuDeleteUrl(String token){
return String.format(MENU_DELETE, token);
}
//获取粉丝信息接口
public static String getFansInfoUrl(String token,String openid){
return String.format(GET_FANS_INFO, token, openid);
}
//获取粉丝列表接口
public static String getFansListUrl(String token,String nextOpenId){
if(nextOpenId == null){
return String.format(GET_FANS_LIST, token);
}else{
return String.format(GET_FANS_LIST + "&next_openid=%s", token, nextOpenId);
}
}
//获取素材列表接口
public static String getBatchMaterialUrl(String token){
return String.format(GET_BATCH_MATERIAL, token);
}
//获取上传图文消息接口
public static String getUploadNewsUrl(String token){
return String.format(UPLOAD_NEWS, token);
}
//群发接口
public static String getMassSendUrl(String token){
return String.format(MASS_SEND, token);
}
//网页授权OAuth2.0获取code
public static String getOAuthCodeUrl(String appId ,String redirectUrl ,String scope ,String state){
return String.format(GET_OAUTH_CODE, appId, urlEnodeUTF8(redirectUrl), "code", scope, state);
}
//网页授权OAuth2.0获取token
public static String getOAuthTokenUrl(String appId ,String appSecret ,String code ){
return String.format(GET_OAUTH_TOKEN, appId, appSecret, code);
}
//网页授权OAuth2.0获取用户信息
public static String getOAuthUserinfoUrl(String token ,String openid){
return String.format(GET_OAUTH_USERINFO, token, openid);
}
//获取创建二维码接口url
public static String getCreateQrcodeUrl(String token){
return String.format(CREATE_QRCODE, token);
}
//获取显示二维码接口
public static String getShowQrcodeUrl(String ticket){
return String.format(SHOW_QRCODE, ticket);
}
//获取js ticket url
public static String getJsApiTicketUrl(String token){
return String.format(GET_JSAPI_TICKET, token);
}
//获取发送客服消息 url
public static String getSendCustomMessageUrl(String token){
return String.format(SEND_CUSTOM_MESSAGE, token);
}
//获取发送模板消息 url
public static String getSendTemplateMessageUrl(String token){
return String.format(SEND_TEMPLATE_MESSAGE, token);
}
/**
* 获取创建临时二维码post data
* @param expireSecodes 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。
* @param scene 临时二维码时为32位非0整型,永久二维码时最大值为100000(目前参数只支持1--100000)
* @return
*/
public static String getQrcodeJson(Integer expireSecodes, Integer scene){
String postStr = "{\"expire_seconds\":%d,\"action_name\":\"QR_SCENE\",\"action_info\":{\"scene\":{\"scene_id\":%d}}";
return String.format(postStr, expireSecodes, scene);
}
/**
* 获取创建临时二维码post data
* @param scene 临时二维码时为32位非0整型,永久二维码时最大值为100000(目前参数只支持1--100000)
* @return
*/
public static String getQrcodeLimitJson(Integer scene){
String postStr = "{\"action_name\":\"QR_LIMIT_SCENE\",\"action_info\":{\"scene\":{\"scene_id\":%d}}";
return String.format(postStr, scene);
}
//获取永久二维码
public static String getQrcodeLimitJson(String sceneStr){
String postStr = "{\"action_name\":\"QR_LIMIT_STR_SCENE\",\"action_info\":{\"scene\":{\"scene_str\":%s}}";
return String.format(postStr, sceneStr);
}
//获取OAuth2.0 Token
public static OAuthAccessToken getOAuthAccessToken(String appId, String appSecret, String code) {
OAuthAccessToken token = null;
String tockenUrl = getOAuthTokenUrl(appId, appSecret, code);
JSONObject jsonObject = httpsRequest(tockenUrl, HttpMethod.GET, null);
if (null != jsonObject && !jsonObject.containsKey("errcode")) {
try {
token = new OAuthAccessToken();
token.setAccessToken(jsonObject.getString("access_token"));
token.setExpiresIn(jsonObject.getInteger("expires_in"));
token.setOpenid(jsonObject.getString("openid"));
token.setScope(jsonObject.getString("scope"));
} catch (JSONException e) {
token = null;//获取token失败
}
}else if(null != jsonObject){
token = new OAuthAccessToken();
token.setErrcode(jsonObject.getInteger("errcode"));
}
return token;
}
//发送请求
public static JSONObject httpsRequest(String requestUrl, String requestMethod) {
return httpsRequest(requestUrl,requestMethod,null);
}
//获取接口访问凭证
public static AccessToken getAccessToken(String appId, String appSecret) {
AccessToken token = null;
String tockenUrl = WxApi.getTokenUrl(appId, appSecret);
JSONObject jsonObject = httpsRequest(tockenUrl, HttpMethod.GET, null);
if (null != jsonObject && !jsonObject.containsKey("errcode")) {
try {
token = new AccessToken();
token.setAccessToken(jsonObject.getString("access_token"));
token.setExpiresIn(jsonObject.getInteger("expires_in"));
} catch (JSONException e) {
token = null;//获取token失败
}
}else if(null != jsonObject){
token = new AccessToken();
token.setErrcode(jsonObject.getInteger("errcode"));
}
return token;
}
public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null;
try {
_log.info("发送HTTPS请求,requestMethod={},requestUrl={},outputStr={}", requestMethod, requestUrl, outputStr);
TrustManager[] tm = { new JEEWeiXinX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestMethod(requestMethod);
if (null != outputStr) {
OutputStream outputStream = conn.getOutputStream();
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
InputStream inputStream = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
StringBuffer buffer = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream = null;
conn.disconnect();
_log.info("响应数据,rtn={}", buffer);
jsonObject = JSONObject.parseObject(buffer.toString());
} catch (Exception e) {
e.printStackTrace();
}
return jsonObject;
}
public static byte[] httpsRequestByte(String requestUrl, String requestMethod) {
return httpsRequestByte(requestUrl,requestMethod,null);
}
public static byte[] httpsRequestByte(String requestUrl, String requestMethod, String outputStr) {
try {
TrustManager[] tm = { new JEEWeiXinX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestMethod(requestMethod);
if (null != outputStr) {
OutputStream outputStream = conn.getOutputStream();
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
InputStream inputStream = conn.getInputStream();
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int n = 0;
while (-1 != (n = inputStream.read(buffer))) {
output.write(buffer, 0, n);
}
return output.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String urlEnodeUTF8(String str){
String result = str;
try {
result = URLEncoder.encode(str,"UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
class JEEWeiXinX509TrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
\ No newline at end of file
package org.xxpay.shop.util.vx;
import com.alibaba.fastjson.JSONObject;
/**
* 微信 客户端,统一处理微信相关接口
*/
public class WxApiClient {
//获取openId
public static String getOAuthOpenId(String appid, String secret, String code){
OAuthAccessToken token = WxApi.getOAuthAccessToken(appid, secret, code);
if(token != null){
if(token.getErrcode() != null){//获取失败
System.out.println("## getOAuthAccessToken Error = " + token.getErrmsg());
}else{
return token.getOpenid();
}
}
return null;
}
//获取accessToken
public static String getAccessToken(MpAccount mpAccount){
//获取唯一的accessToken,如果是多账号,请自行处理
AccessToken token = WxMemoryCacheClient.getSingleAccessToken();
if(token != null && !token.isExpires()){//不为空,并且没有过期
return token.getAccessToken();
}else{
token = WxApi.getAccessToken(mpAccount.getAppid(),mpAccount.getAppsecret());
if(token != null){
if(token.getErrcode() != null){//获取失败
System.out.println("## getAccessToken Error = " + token.getErrmsg());
}else{
WxMemoryCacheClient.addAccessToken(mpAccount.getAccount(), token);
return token.getAccessToken();
}
}
return null;
}
}
/**
* 发送模板消息
* @param tplMsg
* @param mpAccount
* @return
*/
public static JSONObject sendTemplateMessage(TemplateMessage tplMsg, MpAccount mpAccount){
if(tplMsg != null){
String accessToken = getAccessToken(mpAccount);
return WxApi.httpsRequest(WxApi.getSendTemplateMessageUrl(accessToken), HttpMethod.POST, tplMsg.toString());
}
return null;
}
}
package org.xxpay.shop.util.vx;
import org.xxpay.common.util.MyLog;
import java.util.HashMap;
import java.util.Map;
/**
* 缓存工具类;
* 目前使用 服务器内存的方式;
*
* 1、开发者可以根据自己的需求使用不同的缓存方式,比如memcached
* 2、系统默认使用单个公众账号的缓存处理,如果有多个账号,请开发者自行处理
*
*/
public class WxMemoryCacheClient {
private static final MyLog _log = MyLog.getLog(WxMemoryCacheClient.class);
//服务器内存的方式缓存account、accessToken、jsTicket
private static Map<String,MpAccount> mpAccountMap = new HashMap<String,MpAccount>();
private static Map<String,AccessToken> accountAccessTokenMap = new HashMap<String,AccessToken>();
private static Map<String,JSTicket> accountJSTicketMap = new HashMap<String,JSTicket>();
//微信OAuth认证的时候,服务器内存的方式缓存openid; key=sessionid ,value=openid
private static Map<String,OAuthAccessToken> accountOAuthTokenMap = new HashMap<String,OAuthAccessToken>();
public static void addMpAccount(MpAccount account){
if(account != null && !mpAccountMap.containsKey(account.getAccount())){
mpAccountMap.put(account.getAccount(), account);
}
}
public static MpAccount getMpAccount(String account){
return mpAccountMap.get(account);
}
//获取唯一的公众号,如果需要多账号,请自行处理
public static MpAccount getSingleMpAccount(){
MpAccount sigleAccount = null;
for(String key : mpAccountMap.keySet()){
sigleAccount = mpAccountMap.get(key);
break;
}
return sigleAccount;
}
public static AccessToken addAccessToken(String account ,AccessToken token){
if(token != null){
accountAccessTokenMap.put(account, token);
// JSONObject tokenObject = new JSONObject();
// tokenObject.put("access_token", token.getAccessToken());
// tokenObject.put("expires_in", token.getExpiresIn());
// tokenObject.put("create_time", token.getCreateTime());
// MyJedis.set(ConstUtil.RedisCache.REDIS_CACHE_NAME_ROOM, ConstUtil.RedisKey.VVLIVE_VX_ACCESS_TOKEN + account, tokenObject.toJSONString(), token.getExpiresIn());
// _log.info("将access_token保存到redis中,key={},value={},expires={}", ConstUtil.RedisKey.VVLIVE_VX_ACCESS_TOKEN + account, tokenObject.toJSONString(), token.getExpiresIn());
}
return token;
}
/**
* accessToken的获取,绝对不要从缓存中直接获取,请从WxApiClient中获取;
* @param account
* @return
*/
public static AccessToken getAccessToken(String account){
return accountAccessTokenMap.get(account);
}
/**
* 获取唯一的公众号的accessToken,如果需要多账号,请自行处理
* accessToken的获取,绝对不要从缓存中直接获取,请从WxApiClient中获取;
* @return
*/
public static AccessToken getSingleAccessToken(){
AccessToken accessToken = null;
for(String key : accountAccessTokenMap.keySet()){
accessToken = accountAccessTokenMap.get(key);
// 从redis中取
// String tokenJson = MyJedis.get(ConstUtil.RedisCache.REDIS_CACHE_NAME_ROOM, ConstUtil.RedisKey.VVLIVE_VX_ACCESS_TOKEN + key);
// _log.info("从redis中获取access_token,key={},value={}", ConstUtil.RedisKey.VVLIVE_VX_ACCESS_TOKEN + key, tokenJson);
// if(StringUtils.isNotBlank(tokenJson)) {
// JSONObject tokenObject = JSON.parseObject(tokenJson);
// accessToken.setAccessToken(tokenObject.getString("access_token"));
// accessToken.setExpiresIn(tokenObject.getInteger("expires_in"));
// accessToken.setCreateTime(tokenObject.getLong("create_time"));
// }
if (accessToken != null) break;
}
return accessToken;
}
/**
* 添加JSTicket到缓存
* @param account
* @param jsTicket
* @return
*/
public static JSTicket addJSTicket(String account , JSTicket jsTicket){
if(jsTicket != null){
accountJSTicketMap.put(account, jsTicket);
}
return jsTicket;
}
/**
* JSTicket的获取,绝对不要从缓存中直接获取,请从JSTicket中获取;
* @param account
* @return
*/
public static JSTicket getJSTicket(String account){
return accountJSTicketMap.get(account);
}
/**
* 获取唯一的公众号的JSTicket,如果需要多账号,请自行处理
* JSTicket的获取,绝对不要从缓存中直接获取,请从WxApiClient中获取;
* @return
*/
public static JSTicket getSingleJSTicket(){
JSTicket jsTicket = null;
for(String key : accountJSTicketMap.keySet()){
jsTicket = accountJSTicketMap.get(key);
break;
}
return jsTicket;
}
//处理OAuth的Token
public static AccessToken addOAuthAccessToken(String account ,OAuthAccessToken token){
if(token != null){
accountOAuthTokenMap.put(account, token);
}
return token;
}
/**
* OAuthAccessToken的获取,绝对不要从缓存中直接获取,请从WxApiClient中获取;
* @param account
* @return
*/
public static OAuthAccessToken getOAuthAccessToken(String account){
return accountOAuthTokenMap.get(account);
}
/**
* 获取唯一的公众号的accessToken,如果需要多账号,请自行处理
* OAuthAccessToken的获取,绝对不要从缓存中直接获取,请从WxApiClient中获取;
* @return
*/
public static OAuthAccessToken getSingleOAuthAccessToken(){
OAuthAccessToken token = null;
for(String key : accountOAuthTokenMap.keySet()){
token = accountOAuthTokenMap.get(key);
break;
}
return token;
}
}
server.port=8081
spring.freemarker.cache=false
spring.freemarker.charset=UTF-8
spring.freemarker.check-template-location=true
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=true
spring.freemarker.expose-session-attributes=true
spring.freemarker.request-context-attribute=request
spring.freemarker.suffix=.ftl
spring.freemarker.templateEncoding=UTF-8
spring.freemarker.templateLoaderPath=classpath:/templates/
# properties
application.message:Hello,Spring Boot
# \u5FAE\u4FE1\u516C\u4F17\u53F7
application.wx.app_id=wx077cb62e341f8a5c
application.wx.app_secret=e663ea068f3e4f952f143de1432a35c2
#\u6570\u636E\u5E93\u914D\u7F6E
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxpaydb?useUnicode=true&characterEncoding=utf-8&autoReconnect=true
spring.datasource.username=xxpay
spring.datasource.password=xxpay
# \u4E0B\u9762\u4E3A\u8FDE\u63A5\u6C60\u7684\u8865\u5145\u8BBE\u7F6E\uFF0C\u5E94\u7528\u5230\u4E0A\u9762\u6240\u6709\u6570\u636E\u6E90\u4E2D# \u521D\u59CB\u5316\u5927\u5C0F\uFF0C\u6700\u5C0F\uFF0C\u6700\u5927
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
# \u914D\u7F6E\u83B7\u53D6\u8FDE\u63A5\u7B49\u5F85\u8D85\u65F6\u7684\u65F6\u95F4
spring.datasource.maxWait=60000
# \u914D\u7F6E\u95F4\u9694\u591A\u4E45\u624D\u8FDB\u884C\u4E00\u6B21\u68C0\u6D4B\uFF0C\u68C0\u6D4B\u9700\u8981\u5173\u95ED\u7684\u7A7A\u95F2\u8FDE\u63A5\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
spring.datasource.timeBetweenEvictionRunsMillis=60000
# \u914D\u7F6E\u4E00\u4E2A\u8FDE\u63A5\u5728\u6C60\u4E2D\u6700\u5C0F\u751F\u5B58\u7684\u65F6\u95F4\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
# \u6253\u5F00PSCache\uFF0C\u5E76\u4E14\u6307\u5B9A\u6BCF\u4E2A\u8FDE\u63A5\u4E0APSCache\u7684\u5927\u5C0F
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
# \u914D\u7F6E\u76D1\u63A7\u7EDF\u8BA1\u62E6\u622A\u7684filters\uFF0C\u53BB\u6389\u540E\u76D1\u63A7\u754C\u9762sql\u65E0\u6CD5\u7EDF\u8BA1\uFF0C'wall'\u7528\u4E8E\u9632\u706B\u5899
spring.datasource.filters=stat,wall,log4j
# \u901A\u8FC7connectProperties\u5C5E\u6027\u6765\u6253\u5F00mergeSql\u529F\u80FD\uFF1B\u6162SQL\u8BB0\u5F55
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# \u5408\u5E76\u591A\u4E2ADruidDataSource\u7684\u76D1\u63A7\u6570\u636E
#spring.datasource.useGlobalDataSourceStat=true
### \u65E5\u5FD7
logging.file=./log/xxpay-shop.log
spring.mvc.favicon.enabled = false
\ No newline at end of file
generator.jdbc.driver=com.mysql.jdbc.Driver
generator.jdbc.url=jdbc:mysql://127.0.0.1:3306/xxpaydb?useUnicode=true&characterEncoding=utf-8&autoReconnect=true
generator.jdbc.username=xxpay
generator.jdbc.password=xxpay
classPathEntry=/Users/dingzhiwei/java/repository/mysql/mysql-connector-java/5.1.34/mysql-connector-java-5.1.34.jar
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
<!-- 配置文件 -->
<properties resource="generator.properties"></properties>
<!-- 驱动包 -->
<classPathEntry location="${classPathEntry}" />
<context id="MysqlContext" targetRuntime="MyBatis3" defaultModelType="flat">
<property name="javaFileEncoding" value="UTF-8"/>
<!-- 由于beginningDelimiter和endingDelimiter的默认值为双引号("),在Mysql中不能这么写,所以还要将这两个默认值改为` -->
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<property name="useActualColumnNames" value="false" />
<!-- 为生成的Java模型创建一个toString方法 -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin>
<!-- 为生成的Java模型类添加序列化接口,并生成serialVersionUID字段 -->
<plugin type="org.xxpay.shop.dao.plugin.SerializablePlugin">
<property name="suppressJavaInterface" value="false"/>
</plugin>
<!-- 生成一个新的selectByExample方法,这个方法可以接收offset和limit参数,主要用来实现分页 -->
<plugin type="org.xxpay.shop.dao.plugin.PaginationPlugin"></plugin>
<!-- Java模型生成equals和hashcode方法 -->
<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"></plugin>
<!-- 生成的代码去掉注释 -->
<commentGenerator type="org.xxpay.shop.dao.plugin.CommentGenerator">
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
</commentGenerator>
<!-- 数据库连接 -->
<jdbcConnection driverClass="${generator.jdbc.driver}"
connectionURL="${generator.jdbc.url}"
userId="${generator.jdbc.username}"
password="${generator.jdbc.password}"/>
<!-- model生成 -->
<javaModelGenerator targetPackage="org.xxpay.shop.dao.model" targetProject="src/main/java"/>
<!-- MapperXML生成 -->
<sqlMapGenerator targetPackage="org.xxpay.shop.dao.mapper" targetProject="src/main/resources"/>
<!-- Mapper接口生成 -->
<javaClientGenerator targetPackage="org.xxpay.shop.dao.mapper" targetProject="src/main/java" type="XMLMAPPER"/>
<!-- 需要映射的表 -->
<table tableName="t_goods_order" domainObjectName="GoodsOrder"><property name="useActualColumnNames" value="true" /></table>
</context>
</generatorConfiguration>
\ No newline at end of file
Supports Markdown
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