Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
jinli gu
Jeepay
Commits
d53783a9
Commit
d53783a9
authored
Aug 12, 2017
by
jmdhappy
Browse files
初始化提交
parent
324ccaaf
Changes
465
Show whitespace changes
Inline
Side-by-side
xxpay-shop/src/main/java/org/xxpay/shop/demo/MgrDemo.java
0 → 100644
View file @
d53783a9
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
);
}
}
xxpay-shop/src/main/java/org/xxpay/shop/demo/PayOrderDemo.java
0 → 100644
View file @
d53783a9
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
=
"MIITvQYJKoZIhvcNAQcCoIITrjCCE6oCAQExCzAJBgUrDgMCGgUAMIIDXgYJKoZIhvcNAQcBoIIDTwSCA0sxggNHMAoCAQgCAQEEAhYAMAoCARQCAQEEAgwAMAsCAQECAQEEAwIBADALAgEDAgEBBAMMATEwCwIBCwIBAQQDAgEAMAsCAQ4CAQEEAwIBUjALAgEPAgEBBAMCAQAwCwIBEAIBAQQDAgEAMAsCARkCAQEEAwIBAzAMAgEKAgEBBAQWAjQrMA0CAQ0CAQEEBQIDATmsMA0CARMCAQEEBQwDMS4wMA4CAQkCAQEEBgIEUDI0NzAYAgEEAgECBBAoIFpp8t1Yrtx292vHQz30MBkCAQICAQEEEQwPY29tLjUxdnYudnZsaXZlMBsCAQACAQEEEwwRUHJvZHVjdGlvblNhbmRib3gwHAIBBQIBAQQUMuTDMb2ayCzKnlUA3NGDBvKJeq0wHgIBDAIBAQQWFhQyMDE2LTA3LTIwVDA3OjU5OjA0WjAeAgESAgEBBBYWFDIwMTMtMDgtMDFUMDc6MDA6MDBaMEoCAQYCAQEEQqYF5U/8dUbixwRRUQc63fXCzqqV30Bm7dYJABNpREP8v6dtXpuKttS8YskIxCiKJCgySI1ambt4NJRvN4e+HdImjDBKAgEHAgEBBEKYQ1pSzfvdqYuvoe+qRcK/Xl5QjqqSpvPW/w05calaMRyFBHZyzYnyn22+Ci+3m21/S6d/yR4Zq1/wA18PwUz+iUcwggFMAgERAgEBBIIBQjGCAT4wCwICBqwCAQEEAhYAMAsCAgatAgEBBAIMADALAgIGsAIBAQQCFgAwCwICBrICAQEEAgwAMAsCAgazAgEBBAIMADALAgIGtAIBAQQCDAAwCwICBrUCAQEEAgwAMAsCAga2AgEBBAIMADAMAgIGpQIBAQQDAgEBMAwCAgarAgEBBAMCAQEwDAICBq4CAQEEAwIBADAMAgIGrwIBAQQDAgEAMAwCAgaxAgEBBAMCAQAwEgICBqYCAQEECQwHNjAxMDAwMTAbAgIGpwIBAQQSDBAxMDAwMDAwMjI0NjY2Nzc5MBsCAgapAgEBBBIMEDEwMDAwMDAyMjQ2NjY3NzkwHwICBqgCAQEEFhYUMjAxNi0wNy0yMFQwNzo1OTowNFowHwICBqoCAQEEFhYUMjAxNi0wNy0yMFQwNzo1OTowNFqggg5lMIIFfDCCBGSgAwIBAgIIDutXh+eeCY0wDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTUxMTEzMDIxNTA5WhcNMjMwMjA3MjE0ODQ3WjCBiTE3MDUGA1UEAwwuTWFjIEFwcCBTdG9yZSBhbmQgaVR1bmVzIFN0b3JlIFJlY2VpcHQgU2lnbmluZzEsMCoGA1UECwwjQXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMxEzARBgNVBAoMCkFwcGxlIEluYy4xCzAJBgNVBAYTAlVTMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApc+B/SWigVvWh+0j2jMcjuIjwKXEJss9xp/sSg1Vhv+kAteXyjlUbX1/slQYncQsUnGOZHuCzom6SdYI5bSIcc8/W0YuxsQduAOpWKIEPiF41du30I4SjYNMWypoN5PC8r0exNKhDEpYUqsS4+3dH5gVkDUtwswSyo1IgfdYeFRr6IwxNh9KBgxHVPM3kLiykol9X6SFSuHAnOC6pLuCl2P0K5PB/T5vysH1PKmPUhrAJQp2Dt7+mf7/wmv1W16sc1FJCFaJzEOQzI6BAtCgl7ZcsaFpaYeQEGgmJjm4HRBzsApdxXPQ33Y72C3ZiB7j7AfP4o7Q0/omVYHv4gNJIwIDAQABo4IB1zCCAdMwPwYIKwYBBQUHAQEEMzAxMC8GCCsGAQUFBzABhiNodHRwOi8vb2NzcC5hcHBsZS5jb20vb2NzcDAzLXd3ZHIwNDAdBgNVHQ4EFgQUkaSc/MR2t5+givRN9Y82Xe0rBIUwDAYDVR0TAQH/BAIwADAfBgNVHSMEGDAWgBSIJxcJqbYYYIvs67r2R1nFUlSjtzCCAR4GA1UdIASCARUwggERMIIBDQYKKoZIhvdjZAUGATCB/jCBwwYIKwYBBQUHAgIwgbYMgbNSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRlIHBvbGljeSBhbmQgY2VydGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjA2BggrBgEFBQcCARYqaHR0cDovL3d3dy5hcHBsZS5jb20vY2VydGlmaWNhdGVhdXRob3JpdHkvMA4GA1UdDwEB/wQEAwIHgDAQBgoqhkiG92NkBgsBBAIFADANBgkqhkiG9w0BAQUFAAOCAQEADaYb0y4941srB25ClmzT6IxDMIJf4FzRjb69D70a/CWS24yFw4BZ3+Pi1y4FFKwN27a4/vw1LnzLrRdrjn8f5He5sWeVtBNephmGdvhaIJXnY4wPc/zo7cYfrpn4ZUhcoOAoOsAQNy25oAQ5H3O5yAX98t5/GioqbisB/KAgXNnrfSemM/j1mOC+RNuxTGf8bgpPyeIGqNKX86eOa1GiWoR1ZdEWBGLjwV/1CKnPaNmSAMnBjLP4jQBkulhgwHyvj3XKablbKtYdaG6YQvVMpzcZm8w7HHoZQ/Ojbb9IYAYMNpIr7N4YtRHaLSPQjvygaZwXG56AezlHRTBhL8cTqDCCBCIwggMKoAMCAQICCAHevMQ5baAQMA0GCSqGSIb3DQEBBQUAMGIxCzAJBgNVBAYTAlVTMRMwEQYDVQQKEwpBcHBsZSBJbmMuMSYwJAYDVQQLEx1BcHBsZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEWMBQGA1UEAxMNQXBwbGUgUm9vdCBDQTAeFw0xMzAyMDcyMTQ4NDdaFw0yMzAyMDcyMTQ4NDdaMIGWMQswCQYDVQQGEwJVUzETMBEGA1UECgwKQXBwbGUgSW5jLjEsMCoGA1UECwwjQXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMxRDBCBgNVBAMMO0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyjhUpstWqsgkOUjpjO7sX7h/JpG8NFN6znxjgGF3ZF6lByO2Of5QLRVWWHAtfsRuwUqFPi/w3oQaoVfJr3sY/2r6FRJJFQgZrKrbKjLtlmNoUhU9jIrsv2sYleADrAF9lwVnzg6FlTdq7Qm2rmfNUWSfxlzRvFduZzWAdjakh4FuOI/YKxVOeyXYWr9Og8GN0pPVGnG1YJydM05V+RJYDIa4Fg3B5XdFjVBIuist5JSF4ejEncZopbCj/Gd+cLoCWUt3QpE5ufXN4UzvwDtIjKblIV39amq7pxY1YNLmrfNGKcnow4vpecBqYWcVsvD95Wi8Yl9uz5nd7xtj/pJlqwIDAQABo4GmMIGjMB0GA1UdDgQWBBSIJxcJqbYYYIvs67r2R1nFUlSjtzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFCvQaUeUdgn+9GuNLkCm90dNfwheMC4GA1UdHwQnMCUwI6AhoB+GHWh0dHA6Ly9jcmwuYXBwbGUuY29tL3Jvb3QuY3JsMA4GA1UdDwEB/wQEAwIBhjAQBgoqhkiG92NkBgIBBAIFADANBgkqhkiG9w0BAQUFAAOCAQEAT8/vWb4s9bJsL4/uE4cy6AU1qG6LfclpDLnZF7x3LNRn4v2abTpZXN+DAb2yriphcrGvzcNFMI+jgw3OHUe08ZOKo3SbpMOYcoc7Pq9FC5JUuTK7kBhTawpOELbZHVBsIYAKiU5XjGtbPD2m/d73DSMdC0omhz+6kZJMpBkSGW1X9XpYh3toiuSGjErr4kkUqqXdVQCprrtLMK7hoLG8KYDmCXflvjSiAcp/3OIK5ju4u+y6YpXzBWNBgs0POx1MlaTbq/nJlelP5E3nJpmB6bz5tCnSAXpm4S6M9iGKxfh44YGuv9OQnamt86/9OBqWZzAcUaVc7HGKgrRsDwwVHzCCBLswggOjoAMCAQICAQIwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMB4XDTA2MDQyNTIxNDAzNloXDTM1MDIwOTIxNDAzNlowYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5JGpCR+R2x5HUOsF7V55hC3rNqJXTFXsixmJ3vlLbPUHqyIwAugYPvhQCdN/QaiY+dHKZpwkaxHQo7vkGyrDH5WeegykR4tb1BY3M8vED03OFGnRyRly9V0O1X9fm/IlA7pVj01dDfFkNSMVSxVZHbOU9/acns9QusFYUGePCLQg98usLCBvcLY/ATCMt0PPD5098ytJKBrI/s61uQ7ZXhzWyz21Oq30Dw4AkguxIRYudNU8DdtiFqujcZJHU1XBry9Bs/j743DN5qNMRX4fTGtQlkGJxHRiCxCDQYczioGxMFjsWgQyjGizjx3eZXP/Z15lvEnYdp8zFGWhd5TJLQIDAQABo4IBejCCAXYwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFCvQaUeUdgn+9GuNLkCm90dNfwheMB8GA1UdIwQYMBaAFCvQaUeUdgn+9GuNLkCm90dNfwheMIIBEQYDVR0gBIIBCDCCAQQwggEABgkqhkiG92NkBQEwgfIwKgYIKwYBBQUHAgEWHmh0dHBzOi8vd3d3LmFwcGxlLmNvbS9hcHBsZWNhLzCBwwYIKwYBBQUHAgIwgbYagbNSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRlIHBvbGljeSBhbmQgY2VydGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjANBgkqhkiG9w0BAQUFAAOCAQEAXDaZTC14t+2Mm9zzd5vydtJ3ME/BH4WDhRuZPUc38qmbQI4s1LGQEti+9HOb7tJkD8t5TzTYoj75eP9ryAfsfTmDi1Mg0zjEsb+aTwpr/yv8WacFCXwXQFYRHnTTt4sjO0ej1W8k4uvRt3DfD0XhJ8rxbXjt57UXF6jcfiI1yiXV2Q/Wa9SiJCMR96Gsj3OBYMYbWwkvkrL4REjwYDieFfU9JmcgijNq9w2Cz97roy/5U2pbZMBjM3f3OgcsVuvaDyEO2rpzGU+12TZ/wYdV2aeZuTJC+9jVcZ5+oVK3G72TQiQSKscPHbZNnF5jyEuAF1CqitXa5PzQCQc3sHV1ITGCAcswggHHAgEBMIGjMIGWMQswCQYDVQQGEwJVUzETMBEGA1UECgwKQXBwbGUgSW5jLjEsMCoGA1UECwwjQXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMxRDBCBgNVBAMMO0FwcGxlIFdvcmxkd2lkZSBEZXZlbG9wZXIgUmVsYXRpb25zIENlcnRpZmljYXRpb24gQXV0aG9yaXR5AggO61eH554JjTAJBgUrDgMCGgUAMA0GCSqGSIb3DQEBAQUABIIBAB/qcG2kbcE7gIX3Ki/cfI4oj6yG54/U+L+18H37cXQp7/QP7tBYmuzcBICz+CKsxxQtbuGAVgFGUqzgwEN8Ru2c46EAcEGP+KGf/1qTG1iwuDG7yeABnp63/SJALRh+tKX4x+SDTMT0b6QVMYo9X2CXfTzW72/D0Pwq/ZYA4ALqE/J0rQrTYBEUaTIEriyya0/4phZ3QBgRs//zvJBmxR/957pP1tq7UkAMfd8fA3XnnTirxKXZtD/9M5vtUF80TURe9G39nuVj/Z94AMmBKxa4CPMNIQOFRLK2TBGiHF4FbKeSbPEhSJ4OQ74bvnlINKbV96C1REpaNYVfNc6rY+E="
;
paramMap
.
put
(
"mchId"
,
mchId
);
// 商户ID
paramMap
.
put
(
"payOrderId"
,
payOrderId
);
// 支付单号
paramMap
.
put
(
"receiptData"
,
receiptData
);
paramMap
.
put
(
"transactionId"
,
"111"
);
// 苹果支付ID
paramMap
.
put
(
"userId"
,
1984
l
);
// 用户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"
,
1984
l
);
// 用户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
(
"=========苹果支付验证凭据验签失败========="
);
}
}
}
}
xxpay-shop/src/main/java/org/xxpay/shop/service/GoodsOrderService.java
0 → 100644
View file @
d53783a9
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
);
}
}
xxpay-shop/src/main/java/org/xxpay/shop/util/CalendarUtil.java
0 → 100644
View file @
d53783a9
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
();
}
}
}
xxpay-shop/src/main/java/org/xxpay/shop/util/Constant.java
0 → 100644
View file @
d53783a9
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
;
}
xxpay-shop/src/main/java/org/xxpay/shop/util/DateUtil.java
0 → 100644
View file @
d53783a9
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
());
}
}
xxpay-shop/src/main/java/org/xxpay/shop/util/OAuth2RequestParamHelper.java
0 → 100644
View file @
d53783a9
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
);
}
}
}
xxpay-shop/src/main/java/org/xxpay/shop/util/vx/AccessToken.java
0 → 100644
View file @
d53783a9
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
}
}
xxpay-shop/src/main/java/org/xxpay/shop/util/vx/ErrCode.java
0 → 100644
View file @
d53783a9
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
;
}
}
xxpay-shop/src/main/java/org/xxpay/shop/util/vx/HttpMethod.java
0 → 100644
View file @
d53783a9
package
org.xxpay.shop.util.vx
;
/**
*
*/
public
class
HttpMethod
{
public
static
final
String
POST
=
"POST"
;
public
static
final
String
GET
=
"GET"
;
}
xxpay-shop/src/main/java/org/xxpay/shop/util/vx/JSTicket.java
0 → 100644
View file @
d53783a9
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
}
}
xxpay-shop/src/main/java/org/xxpay/shop/util/vx/MpAccount.java
0 → 100644
View file @
d53783a9
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
;
}
}
xxpay-shop/src/main/java/org/xxpay/shop/util/vx/OAuthAccessToken.java
0 → 100644
View file @
d53783a9
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
;
}
}
xxpay-shop/src/main/java/org/xxpay/shop/util/vx/TemplateMessage.java
0 → 100644
View file @
d53783a9
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
();
}
}
xxpay-shop/src/main/java/org/xxpay/shop/util/vx/WxApi.java
0 → 100644
View file @
d53783a9
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
xxpay-shop/src/main/java/org/xxpay/shop/util/vx/WxApiClient.java
0 → 100644
View file @
d53783a9
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
;
}
}
xxpay-shop/src/main/java/org/xxpay/shop/util/vx/WxMemoryCacheClient.java
0 → 100644
View file @
d53783a9
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
;
}
}
xxpay-shop/src/main/resources/application.properties
0 → 100755
View file @
d53783a9
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
xxpay-shop/src/main/resources/generator.properties
0 → 100644
View file @
d53783a9
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
xxpay-shop/src/main/resources/generatorConfig.xml
0 → 100644
View file @
d53783a9
<?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
Prev
1
…
13
14
15
16
17
18
19
20
21
…
24
Next
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment