Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
V
volunteer_service
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
licc
volunteer_service
Commits
741523ea
Commit
741523ea
authored
Mar 26, 2021
by
cy
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
支付,广告填加标题字段
parent
805089bc
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
561 additions
and
186 deletions
+561
-186
BannerMapper.xml
wisenergy-mapper/src/main/resources/mapper/BannerMapper.xml
+4
-2
PayRecordMapper.xml
...ergy-mapper/src/main/resources/mapper/PayRecordMapper.xml
+2
-0
Banner.java
...gy-model/src/main/java/cn/wisenergy/model/app/Banner.java
+6
-0
BannerDto.java
...model/src/main/java/cn/wisenergy/model/dto/BannerDto.java
+6
-0
pom.xml
wisenergy-service/pom.xml
+6
-0
AliPayService.java
...src/main/java/cn/wisenergy/service/app/AliPayService.java
+11
-1
TestWxPayService.java
.../main/java/cn/wisenergy/service/app/TestWxPayService.java
+4
-0
AliPayServiceImpl.java
...java/cn/wisenergy/service/app/impl/AliPayServiceImpl.java
+167
-57
TestWxPayServiceImpl.java
...a/cn/wisenergy/service/app/impl/TestWxPayServiceImpl.java
+126
-75
UserLimitServiceImpl.java
...a/cn/wisenergy/service/app/impl/UserLimitServiceImpl.java
+1
-1
WxPayServiceImpl.java
.../java/cn/wisenergy/service/app/impl/WxPayServiceImpl.java
+3
-3
Common.java
...ice/src/main/java/cn/wisenergy/service/common/Common.java
+22
-30
VolunteerManager.java
...in/java/cn/wisenergy/service/common/VolunteerManager.java
+3
-0
WxPayUtil.java
...ce/src/main/java/cn/wisenergy/service/util/WxPayUtil.java
+160
-5
WxCommon.java
...ce/src/main/java/cn/wisenergy/service/wxpay/WxCommon.java
+2
-2
wisenergy-service.iml
wisenergy-service/wisenergy-service.iml
+3
-0
PayController.java
.../cn/wisenergy/web/admin/controller/app/PayController.java
+21
-9
application-dev.yml
wisenergy-web-admin/src/main/resources/application-dev.yml
+11
-1
wisenergy-web-admin.iml
wisenergy-web-admin/wisenergy-web-admin.iml
+3
-0
No files found.
wisenergy-mapper/src/main/resources/mapper/BannerMapper.xml
View file @
741523ea
...
...
@@ -12,6 +12,7 @@
<result
column=
"image"
property=
"image"
/>
<result
column=
"create_time"
property=
"createTime"
/>
<result
column=
"update_time"
property=
"updateTime"
/>
<result
column=
"title"
property=
"title"
/>
</resultMap>
<sql
id=
"table"
>
...
...
@@ -24,11 +25,11 @@
</sql>
<sql
id=
"cols_exclude_id"
>
company_name,status, website,is_have_image,type,image, create_time,update_time
company_name,status, website,is_have_image,type,image, create_time,update_time
,title
</sql>
<sql
id=
"vals"
>
#{companyName},#{status},#{website},#{isHaveImage},#{type},#{image},now(),now()
#{companyName},#{status},#{website},#{isHaveImage},#{type},#{image},now(),now()
,#{title}
</sql>
<sql
id=
"updateCondition"
>
...
...
@@ -38,6 +39,7 @@
<if
test=
"isHaveImage != null"
>
is_have_image =#{isHaveImage},
</if>
<if
test=
"type != null"
>
type =#{type},
</if>
<if
test=
"image != null"
>
image =#{image},
</if>
<if
test=
"title != null"
>
title =#{title},
</if>
update_time =now()
</sql>
...
...
wisenergy-mapper/src/main/resources/mapper/PayRecordMapper.xml
View file @
741523ea
...
...
@@ -71,6 +71,7 @@
<if
test=
"userId != null"
>
user_id=#{userId}
</if>
and result=0
order by create_time desc
limit #{startNum},#{endNum}
</where>
...
...
@@ -85,6 +86,7 @@
<if
test=
"userId != null"
>
user_id=#{userId}
</if>
and result=0
</where>
</select>
...
...
wisenergy-model/src/main/java/cn/wisenergy/model/app/Banner.java
View file @
741523ea
...
...
@@ -71,4 +71,10 @@ public class Banner implements Serializable {
*/
@ApiModelProperty
(
value
=
"更新时间"
,
name
=
"updateTime"
)
private
Date
updateTime
;
/**
* 标题
*/
@ApiModelProperty
(
value
=
"标题"
,
name
=
"title"
)
private
String
title
;
}
wisenergy-model/src/main/java/cn/wisenergy/model/dto/BannerDto.java
View file @
741523ea
...
...
@@ -49,4 +49,10 @@ public class BannerDto {
*/
@ApiModelProperty
(
value
=
"更新时间"
,
name
=
"updateTime"
)
private
Date
updateTime
;
/**
* 标题
*/
@ApiModelProperty
(
value
=
"标题"
,
name
=
"title"
)
private
String
title
;
}
wisenergy-service/pom.xml
View file @
741523ea
...
...
@@ -53,6 +53,12 @@
<artifactId>
okhttp
</artifactId>
<version>
3.6.0
</version>
</dependency>
<!-- 微信支付 sdk -->
<dependency>
<groupId>
com.github.wxpay
</groupId>
<artifactId>
wxpay-sdk
</artifactId>
<version>
0.0.3
</version>
</dependency>
<dependency>
<groupId>
com.github.wechatpay-apiv3
</groupId>
...
...
wisenergy-service/src/main/java/cn/wisenergy/service/app/AliPayService.java
View file @
741523ea
...
...
@@ -6,6 +6,7 @@ import cn.wisenergy.model.dto.PayQueryDto;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
public
interface
AliPayService
{
...
...
@@ -18,6 +19,15 @@ public interface AliPayService {
*/
R
<
String
>
doPost
(
PayPageDto
payPageDto
,
HttpServletRequest
request
,
HttpServletResponse
httpResponse
);
/***
* 手机网页端支付宝支付接口
* @param payPageDto
* @param request
* @param httpResponse
* @return
*/
R
<
String
>
wapAliPay
(
PayPageDto
payPageDto
,
HttpServletRequest
request
,
HttpServletResponse
httpResponse
);
...
...
@@ -34,5 +44,5 @@ public interface AliPayService {
* @param request
* @return
*/
R
<
String
>
aliPayCallBack
(
HttpServletResponse
response
,
HttpServletRequest
request
)
;
void
aliPayCallBack
(
HttpServletResponse
response
,
HttpServletRequest
request
)
throws
IOException
,
Exception
;
}
wisenergy-service/src/main/java/cn/wisenergy/service/app/TestWxPayService.java
View file @
741523ea
...
...
@@ -2,6 +2,7 @@ package cn.wisenergy.service.app;
import
cn.wisenergy.common.utils.R
;
import
cn.wisenergy.model.dto.PayPageDto
;
import
com.fasterxml.jackson.core.JsonProcessingException
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
...
...
@@ -18,6 +19,9 @@ public interface TestWxPayService {
*/
R
<
String
>
wxPay
(
PayPageDto
payPageDto
,
HttpServletResponse
response
);
R
<
String
>
h5WxPay
(
PayPageDto
payPageDto
,
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
JsonProcessingException
;
R
<
String
>
WxPayApplets
(
PayPageDto
payPageDto
,
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
JsonProcessingException
;
/***
*测试-支付成功回调
* @param request
...
...
wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/AliPayServiceImpl.java
View file @
741523ea
This diff is collapsed.
Click to expand it.
wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/TestWxPayServiceImpl.java
View file @
741523ea
This diff is collapsed.
Click to expand it.
wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/UserLimitServiceImpl.java
View file @
741523ea
...
...
@@ -124,7 +124,7 @@ public class UserLimitServiceImpl extends ServiceImpl<UserLimitMapper, UserLimit
//增加用户总查询次数
Integer
total
=
userLimit
.
getTotalLimit
()
+
price
.
getUseLimit
();
userLimit
.
setUseLimit
(
usableNumber
);
userLimit
.
setUs
abl
eLimit
(
usableNumber
);
userLimit
.
setTotalLimit
(
total
);
//更新充值卡状态和用户查询次数及增加充值记录
...
...
wisenergy-service/src/main/java/cn/wisenergy/service/app/impl/WxPayServiceImpl.java
View file @
741523ea
...
...
@@ -107,7 +107,7 @@ public class WxPayServiceImpl implements WxPayService {
String
nonceStr
=
UUID
.
randomUUID
().
toString
().
replace
(
"-"
,
""
);
String
method
=
"POST"
;
String
tradeNo
=
"21"
+
System
.
currentTimeMillis
();
HttpUrl
httpurl
=
HttpUrl
.
parse
(
WxCommon
.
WX_PAY_URL
);
HttpUrl
httpurl
=
HttpUrl
.
parse
(
WxCommon
.
WX_PAY_URL
_pc
);
//构造签名参数
JSONObject
jsonObject
=
new
JSONObject
();
...
...
@@ -162,13 +162,13 @@ public class WxPayServiceImpl implements WxPayService {
@Override
public
R
<
String
>
wx_Pay
(
PayPageDto
payPageDto
)
throws
IOException
,
NoSuchAlgorithmException
,
SignatureException
,
InvalidKeySpecException
,
InvalidKeyException
,
IllegalBlockSizeException
{
HttpPost
httpPost
=
new
HttpPost
(
WxCommon
.
WX_PAY_URL
);
HttpPost
httpPost
=
new
HttpPost
(
WxCommon
.
WX_PAY_URL
_pc
);
long
timestamp
=
System
.
currentTimeMillis
()
/
1000
;
String
nonceStr
=
UUID
.
randomUUID
().
toString
().
replace
(
"-"
,
""
);
String
method
=
"POST"
;
String
tradeNo
=
"21"
+
System
.
currentTimeMillis
();
HttpUrl
httpurl
=
HttpUrl
.
parse
(
WxCommon
.
WX_PAY_URL
);
HttpUrl
httpurl
=
HttpUrl
.
parse
(
WxCommon
.
WX_PAY_URL
_pc
);
// 请求body参数
String
reqdata
=
"{"
...
...
wisenergy-service/src/main/java/cn/wisenergy/service/common/Common.java
View file @
741523ea
...
...
@@ -30,44 +30,36 @@ public class Common {
public
static
final
long
SMS_TIMEOUT
=
1200
;
/**
* 支付宝
支付
app_id
* 支付宝
--
app_id
*/
public
static
final
String
PAY_URL
=
"https://openapi.alipay.com/gateway.do"
;
public
static
final
String
APP_ID
=
"2021002126609937"
;
public
static
final
String
ALIPAY_PUBLIC_KEY
=
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2cUDFyw7sLp"
+
"TpICDURNefRfzr7I7qO5Spq6HwdyFbVv5m6wVzt3fXYTcDrVUuzfbV7+rrXqnvk7LNOp10qPtUyHyZKO2jTBBcUK5H0RPNz"
+
"s1XInKaSTAznGH8dEAk6yQiwhSDpQzwoOq1Ool2MQocdkcBWwAMEcEUByIbJ4ABsrwXdmkgu2hDHR/GgLvarUp1zOXfZkaTK//L"
+
"1GUI5uCI+/omcqMPDIOwd8DfcNr0TKlXfAEixp9eVuU/b09b7vW7O9Vh+w0gmy5FN+BWX/JaRRL1DhRqbHl7Sl4/oGu1yjfQA5U"
+
"8jXBgd+QjwdUiAXVwPdESS/AUbPWE517eH5FtQIDAQAB"
;
public
static
final
String
PRIVATE_KEY
=
"MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDAzZQsv"
+
"7wKd/01D8YPqrMcevfi0rS81H4NObDkF/Y37ii+/V1vlzODiTQajeCWOM42kijTSFHiietwx7PRa57GI/BzhRbs3MeK"
+
"fvOkFVhUHklfOb9vT9E/y9TE7oWmbQVJThcytXerJbC95LDchJtBxQula/wmp0pwgkwFHM5IxNbT1Oh9UWKBn6"
+
"OoOuHhgFhO19l9+X4hJtb/rjKl8/K4ULrlxPfrnX75tbJryBS1VnkxiWyHTara1WkRDIKmLRSrHeDG1hh1NKMOA"
+
"5jc2sfNOEuMhsgC1FY9sxd/Ap3dBp3TP3drAYpshaweYQwK9PyQ8b/TYgccIclgsJJ0BxMtAgMBAAECggEAD6sl"
+
"VZWnZHpn234SrIdE0xWzO33ALnBeZhjAJWlFGzqBmTPh+gWhrBjkYRwSmmK3b3vlUXZZIT3wIlQ4ataCKrwU+G"
+
"5idJFkrf6vMjCB4yQq9lAtHJCyAqs/+VkhB2touJJeFELnHMONX4FMVj94lpm63pCuBz4lMIuGPgwfP46Lgiuy4"
+
"xOhcczcr3jwUmaVJvvDVtDJ477gsr/P/HhidCVwBE+vPovFmZ/cbI8ud31Ta2P7VFvrJKheL36GEJ1c1cHE7gcS"
+
"P7KsuzXfQP/6KjqM6QhWHem0s0vOUaplPrPhEArhmfhjqukD/U2lBTHzmE7iUlmPHEQRbQdwJIk4SQKBgQDgjd"
+
"+VxxJ8pYigvyDK+OiXwA8hKwMiQGhA1XexjBnf2rTEimBwMNU87lKmsgCRsv26DAiVyPqiA5R2nPL3N4Sk8k7f"
+
"KD6gRBzC1/91XtI2HsljdGZemW1V/4D5o2Su9lmsPl3UV8U54izp5JzerXB+5sULpfKyKf5iVJtb+a7adwKBgQ"
+
"DbzXJXGMGc052StU4CwKeKElhTdB8uYbeML2Em0bwh1jZXwD/s2X7m8LAkOB2xaKQqrxjipcArIeAylI7xeEx24"
+
"MVDk3C3BnZaZoiuvvWr0caGQHE0JHvtpCrs2xoXm7wMNsVLjc345ssEQM0ytVXsx/PcA1WwwrBAQNFiH4fEewK"
+
"BgQDKBbm+lYADViXKgMlu8mrHg8nYzEqgeROSKLrrqCDrLWduXxQOO1DM5ZjEUeaDLmZpCER9BXi/Y7sgz2kjk"
+
"vYqM7lTuXBGXaEGhq9Ul/9FI4OJj4I934jnUtxlO2PsqMPaW62syV4uClbgAoZDLATGlrV2GlFziqZLLtUq9UI"
+
"jVwKBgQCmZGSGYotO+TNz+CRSGR27fB+5LVLdfcPBL6zQAj31L4B79WFvH0bd9J6jDIgN4TVFyr9/9BIBlOdv4t5"
+
"DFdpss8MhYOAW7aFy1ePqxUydAXTT9Ly9yFC4mWqVW1fpP0+fv2ajx3mBTtWpJpUwKe4eDVAh4bRg10EtouPe8B"
+
"eLOQKBgQCwsHZbrfgm8qrAhhoqPkxHHUDcQVhWpcBrv49ghpPLTsEPrOnYsFMCKb0nJc2goJ"
+
"BQIT4QMu62i1jOInaIZyrf/1H3WuWhjI3SjObHiz1a0rmuCrFMPCpnAVlIYJvmAyrGJIvSSLEN33mUZnq1z4REgjn0FlzS0FMOVDRVAeMm7w=="
;
/***
* 支付宝--回调地址
*/
public
static
final
String
NOTIFY_URL
=
"http://111.203.232.171:8997/pay/aliPayCallBack.do"
;
/***
* 支付宝--pc端支付成功跳转地址
*/
public
static
final
String
RETURN_URL_PC
=
"http://111.203.232.171:8999/wallet"
;
/***
* 支付宝--手机网页支付成功跳转地址
*/
public
static
final
String
RETURN_URL_WAP
=
"http://111.203.232.171:8999/#/history"
;
/**
* 沙箱 --支付宝
支付app_id
* 沙箱 --支付宝
*/
public
static
final
String
APP_ID_CS
=
"2016101300675128"
;
public
static
final
String
PAY_URL_CS
=
"https://openapi.alipaydev.com/gateway.do"
;
public
static
final
String
ALIPAY_PUBLIC_KEY_CS
=
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQE"
+
"AovyCboYeJzNSUjBJmMss2NHo4JgAnn+cqnEUZFEeIO0u1JDGsxE3NLYwU54fM8OQunf3S6RxzIjZ/9jAaUtu"
+
"LjVmJBAa3ac5leHpm5LKWl0olKYER3qZTJQFgoRymfZHzVqqDoVsnFJScfsNR7XDD9bsFiHa9R+c+fI+pPapHK"
+
...
...
@@ -95,5 +87,5 @@ public class Common {
"TFmmjrgNNXMiqhVZBxVf+GwwHdI0Rz8OukagIHeCHdG6nwu2aW+B9NsDhusiXjwU1rb28l6KNHRZqQ74PVREYyU"
+
"hTc2T2fobY0qmPBy2CIrO3gL4skn+ZZLHaUeK3sinQ="
;
public
static
final
String
PAY_URL_CS
=
"https://openapi.alipaydev.com/gateway.do"
;
}
wisenergy-service/src/main/java/cn/wisenergy/service/common/VolunteerManager.java
View file @
741523ea
...
...
@@ -20,6 +20,7 @@ import org.springframework.stereotype.Component;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.stream.Collectors
;
...
...
@@ -168,8 +169,10 @@ public class VolunteerManager {
QueryWrapper
<
PayRecord
>
queryWrapper
=
new
QueryWrapper
<>();
queryWrapper
.
eq
(
"trade_no"
,
payRecord
.
getTradeNo
());
PayRecord
byTradeNo
=
payRecordMapper
.
selectOne
(
queryWrapper
);
payRecord
.
setId
(
byTradeNo
.
getId
());
int
pay
=
0
;
if
(
null
!=
byTradeNo
){
payRecord
.
setUpdateTime
(
new
Date
());
pay
=
payRecordMapper
.
updateById
(
payRecord
);
}
else
{
pay
=
payRecordMapper
.
add
(
payRecord
);
...
...
wisenergy-service/src/main/java/cn/wisenergy/service/util/WxPayUtil.java
View file @
741523ea
package
cn
.
wisenergy
.
service
.
util
;
import
cn.wisenergy.common.utils.Md5Util
;
import
cn.wisenergy.model.dto.PayPageDto
;
import
cn.wisenergy.service.httpClient.WechatPayHttpClientBuilder
;
import
cn.wisenergy.service.httpClient.auth.AutoUpdateCertificatesVerifier
;
...
...
@@ -9,8 +10,9 @@ import cn.wisenergy.service.httpClient.auth.WechatPay2Credentials;
import
cn.wisenergy.service.httpClient.auth.WechatPay2Validator
;
import
cn.wisenergy.service.httpClient.util.PemUtil
;
import
cn.wisenergy.service.wxpay.WxCommon
;
import
com.
alibaba.fastjson.JSONObject
;
import
com.
fasterxml.jackson.core.JsonProcessingException
;
import
okhttp3.HttpUrl
;
import
org.apache.commons.lang.RandomStringUtils
;
import
org.apache.http.HttpEntity
;
import
org.apache.http.client.methods.CloseableHttpResponse
;
import
org.apache.http.client.methods.HttpPost
;
...
...
@@ -19,7 +21,9 @@ import org.apache.http.entity.StringEntity;
import
org.apache.http.impl.client.CloseableHttpClient
;
import
org.apache.http.util.EntityUtils
;
import
org.junit.After
;
import
org.springframework.beans.factory.annotation.Value
;
import
javax.servlet.http.HttpServletRequest
;
import
java.io.ByteArrayInputStream
;
import
java.io.IOException
;
import
java.io.UnsupportedEncodingException
;
...
...
@@ -28,11 +32,17 @@ import java.security.NoSuchAlgorithmException;
import
java.security.PrivateKey
;
import
java.security.SignatureException
;
import
java.security.spec.InvalidKeySpecException
;
import
java.util.UUID
;
import
java.text.DecimalFormat
;
import
java.util.*
;
public
class
WxPayUtil
{
@Value
(
"${wxPay.APP_ID}"
)
private
static
String
appid
;
@Value
(
"${wxPay.MCH_ID}"
)
private
static
String
mchid
;
@Value
(
"${wxPay.PRIVATE_KEY}"
)
private
static
String
key
;
/**
* 商户号
*/
...
...
@@ -80,13 +90,13 @@ public class WxPayUtil {
}
public
static
void
main
(
String
[]
args
)
throws
IOException
,
NoSuchAlgorithmException
,
SignatureException
,
InvalidKeySpecException
,
InvalidKeyException
{
HttpPost
httpPost
=
new
HttpPost
(
WxCommon
.
WX_PAY_URL
);
HttpPost
httpPost
=
new
HttpPost
(
WxCommon
.
WX_PAY_URL
_pc
);
long
timestamp
=
System
.
currentTimeMillis
()
/
1000
;
String
nonceStr
=
UUID
.
randomUUID
().
toString
().
replace
(
"-"
,
""
);
String
method
=
"POST"
;
String
tradeNo
=
"21"
+
System
.
currentTimeMillis
();
HttpUrl
httpurl
=
HttpUrl
.
parse
(
WxCommon
.
WX_PAY_URL
);
HttpUrl
httpurl
=
HttpUrl
.
parse
(
WxCommon
.
WX_PAY_URL
_pc
);
// 请求body参数
String
reqdata
=
"{"
...
...
@@ -169,4 +179,149 @@ public class WxPayUtil {
response
.
close
();
}
}
/***
* pc端生成统一下单格式的订单,生成一个XML格式的字符串
* @return
* @throws UnsupportedEncodingException
*/
public
static
String
createOrderInfo
(
PayPageDto
payPageDto
,
String
tradeNo
)
throws
UnsupportedEncodingException
{
String
nonce_str
=
RandomStringUtils
.
randomAlphanumeric
(
16
);
SortedMap
<
String
,
String
>
parameters
=
new
TreeMap
<
String
,
String
>();
parameters
.
put
(
"appid"
,
WxCommon
.
APP_ID
);
parameters
.
put
(
"mchid"
,
mchId
);
parameters
.
put
(
"body"
,
"充值"
);
parameters
.
put
(
"out_trade_no"
,
tradeNo
);
parameters
.
put
(
"nonce_str"
,
nonce_str
);
DecimalFormat
df
=
new
DecimalFormat
(
"#"
);
//parameters.put("total_fee", df.format(payPageDto.getTotal()*100));
parameters
.
put
(
"total_fee"
,
df
.
format
(
1
));
parameters
.
put
(
"notify_url"
,
WxCommon
.
NOTIFY_URL
);
parameters
.
put
(
"trade_type"
,
"NATIVE"
);
String
characterEncoding
=
"UTF-8"
;
String
sign
=
createSign
(
characterEncoding
,
parameters
);
parameters
.
put
(
"sign"
,
sign
);
//签名
//将订单对象转为xml格式
String
s
=
null
;
try
{
return
MapToXmlUtils
.
mapToXml
(
parameters
);
//maptoXml方法是微信sdk自带的方法
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
new
String
(
s
.
getBytes
(
"UTF-8"
));
}
/***
* h5生成统一下单格式的订单,生成一个XML格式的字符串
* @return
* @throws UnsupportedEncodingException
*/
public
static
String
createOrderInfoH5
(
PayPageDto
payPageDto
,
String
tradeNo
,
HttpServletRequest
request
)
throws
UnsupportedEncodingException
,
JsonProcessingException
{
String
nonce_str
=
RandomStringUtils
.
randomAlphanumeric
(
16
);
String
sceneInfo
=
"{'h5_info':{'type':'WAP','wap_url': 'http://111.203.232.171:8999/','wap_name': '充值'}}"
;
String
spbill_create_ip
=
getRealIp
(
request
);
SortedMap
<
String
,
String
>
parameters
=
new
TreeMap
<
String
,
String
>();
parameters
.
put
(
"appid"
,
appid
);
parameters
.
put
(
"mchid"
,
mchid
);
parameters
.
put
(
"body"
,
"充值"
);
parameters
.
put
(
"out_trade_no"
,
tradeNo
);
parameters
.
put
(
"nonce_str"
,
nonce_str
);
DecimalFormat
df
=
new
DecimalFormat
(
"#"
);
//parameters.put("total_fee", df.format(payPageDto.getTotal()*100));
parameters
.
put
(
"total_fee"
,
df
.
format
(
1
));
parameters
.
put
(
"notify_url"
,
WxCommon
.
NOTIFY_URL
);
parameters
.
put
(
"trade_type"
,
"MWEB"
);
parameters
.
put
(
"scene_info"
,
sceneInfo
);
parameters
.
put
(
"spbill_create_ip"
,
spbill_create_ip
);
String
characterEncoding
=
"UTF-8"
;
String
sign
=
createSign
(
characterEncoding
,
parameters
);
parameters
.
put
(
"sign"
,
sign
);
//签名
//将订单对象转为xml格式
String
s
=
null
;
try
{
return
MapToXmlUtils
.
mapToXml
(
parameters
);
//maptoXml方法是微信sdk自带的方法
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
new
String
(
s
.
getBytes
(
"UTF-8"
));
}
/***
* 小程序生成统一下单格式的订单,生成一个XML格式的字符串
* @return
* @throws UnsupportedEncodingException
*/
public
static
String
createOrderInfoWx
(
PayPageDto
payPageDto
,
String
tradeNo
,
HttpServletRequest
request
,
String
nonce_str
)
throws
UnsupportedEncodingException
,
JsonProcessingException
{
SortedMap
<
String
,
String
>
parameters
=
new
TreeMap
<
String
,
String
>();
parameters
.
put
(
"appid"
,
appid
);
parameters
.
put
(
"mchid"
,
mchid
);
parameters
.
put
(
"body"
,
"充值"
);
parameters
.
put
(
"out_trade_no"
,
tradeNo
);
parameters
.
put
(
"nonce_str"
,
nonce_str
);
DecimalFormat
df
=
new
DecimalFormat
(
"#"
);
//parameters.put("total_fee", df.format(payPageDto.getTotal()*100));
parameters
.
put
(
"total_fee"
,
df
.
format
(
1
));
parameters
.
put
(
"notify_url"
,
WxCommon
.
NOTIFY_URL
);
parameters
.
put
(
"trade_type"
,
"JSAPI"
);
String
characterEncoding
=
"UTF-8"
;
String
sign
=
createSign
(
characterEncoding
,
parameters
);
parameters
.
put
(
"sign"
,
sign
);
//签名
//将订单对象转为xml格式
String
s
=
null
;
try
{
return
MapToXmlUtils
.
mapToXml
(
parameters
);
//maptoXml方法是微信sdk自带的方法
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
new
String
(
s
.
getBytes
(
"UTF-8"
));
}
/***
* 生成签名
* @param characterEncoding
* @param parameters
* @return
*/
public
static
String
createSign
(
String
characterEncoding
,
SortedMap
<
String
,
String
>
parameters
){
StringBuffer
sb
=
new
StringBuffer
();
Set
es
=
parameters
.
entrySet
();
//所有参与传参的参数按照accsii排序(升序)
Iterator
it
=
es
.
iterator
();
while
(
it
.
hasNext
())
{
Map
.
Entry
entry
=
(
Map
.
Entry
)
it
.
next
();
String
k
=
(
String
)
entry
.
getKey
();
Object
v
=
entry
.
getValue
();
if
(
null
!=
v
&&
!
""
.
equals
(
v
)
&&
!
"sign"
.
equals
(
k
)
&&
!
"key"
.
equals
(
k
))
{
sb
.
append
(
k
+
"="
+
v
+
"&"
);
}
}
sb
.
append
(
"key="
+
WxCommon
.
PRIVATE_KEY
);
String
sign
=
Md5Util
.
MD5Encode
(
sb
.
toString
(),
characterEncoding
).
toUpperCase
();
System
.
out
.
println
(
"签名:"
+
sign
);
return
sign
;
}
/**
* 获取真实ip地址 通过阿帕奇代理的也能获取到真实ip
* @param request
* @return
*/
public
static
String
getRealIp
(
HttpServletRequest
request
)
{
String
ip
=
request
.
getHeader
(
"x-forwarded-for"
);
if
(
ip
==
null
||
ip
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ip
))
{
ip
=
request
.
getHeader
(
"Proxy-Client-IP"
);
}
if
(
ip
==
null
||
ip
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ip
))
{
ip
=
request
.
getHeader
(
"WL-Proxy-Client-IP"
);
}
if
(
ip
==
null
||
ip
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ip
))
{
ip
=
request
.
getRemoteAddr
();
}
return
ip
;
}
}
wisenergy-service/src/main/java/cn/wisenergy/service/wxpay/WxCommon.java
View file @
741523ea
...
...
@@ -12,9 +12,9 @@ public class WxCommon {
public
static
final
String
MCHID
=
"1606042985"
;
public
static
final
String
NOTIFY_URL
=
"http://
www.baodu.com
"
;
public
static
final
String
NOTIFY_URL
=
"http://
http://tcdwak.natappfree.cc/pay/wxPayCallBack.do
"
;
public
static
final
String
WX_PAY_URL
=
"https://api.mch.weixin.qq.com/v3/pay/transactions/native"
;
public
static
final
String
WX_PAY_URL
_pc
=
"https://api.mch.weixin.qq.com/v3/pay/transactions/native"
;
public
static
final
String
WX_PAY_QUERY
=
"https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/"
;
...
...
wisenergy-service/wisenergy-service.iml
View file @
741523ea
...
...
@@ -49,6 +49,8 @@
<orderEntry
type=
"library"
name=
"Maven: org.springframework:spring-expression:5.1.7.RELEASE"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: org.springframework.boot:spring-boot-starter-undertow:2.1.5.RELEASE"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: io.undertow:undertow-core:2.0.20.Final"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: org.jboss.xnio:xnio-api:3.3.8.Final"
level=
"project"
/>
<orderEntry
type=
"library"
scope=
"RUNTIME"
name=
"Maven: org.jboss.xnio:xnio-nio:3.3.8.Final"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: io.undertow:undertow-servlet:2.0.20.Final"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:1.0.2.Final"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: io.undertow:undertow-websockets-jsr:2.0.20.Final"
level=
"project"
/>
...
...
@@ -162,6 +164,7 @@
<orderEntry
type=
"library"
name=
"Maven: org.bouncycastle:bcprov-jdk15on:1.62"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: com.squareup.okhttp3:okhttp:3.6.0"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: com.squareup.okio:okio:1.11.0"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: com.github.wxpay:wxpay-sdk:0.0.3"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: com.github.wechatpay-apiv3:wechatpay-apache-httpclient:0.2.1"
level=
"project"
/>
<orderEntry
type=
"library"
scope=
"RUNTIME"
name=
"Maven: org.apache.httpcomponents:httpmime:4.5.8"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: com.fasterxml.jackson.core:jackson-databind:2.9.8"
level=
"project"
/>
...
...
wisenergy-web-admin/src/main/java/cn/wisenergy/web/admin/controller/app/PayController.java
View file @
741523ea
...
...
@@ -12,6 +12,7 @@ import com.alipay.api.AlipayClient;
import
com.alipay.api.DefaultAlipayClient
;
import
com.alipay.api.request.AlipayTradeQueryRequest
;
import
com.alipay.api.response.AlipayTradeQueryResponse
;
import
com.fasterxml.jackson.core.JsonProcessingException
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiImplicitParam
;
import
io.swagger.annotations.ApiOperation
;
...
...
@@ -54,14 +55,20 @@ public class PayController {
@ApiOperation
(
value
=
"PC支付宝-支付接口"
,
notes
=
"PC支付宝-支付接口"
,
httpMethod
=
"POST"
)
@ApiImplicitParam
(
name
=
"payPageDto"
,
value
=
"参数"
,
dataType
=
"PayPageDto"
)
@PostMapping
(
"/page"
)
//
public R<String> doPost(@RequestBody PayPageDto payPageDto, HttpServletRequest request, HttpServletResponse httpResponse) {
public
R
<
String
>
doPost
(
Integer
userId
,
Integer
payType
,
Integer
total_amount
,
HttpServletRequest
request
,
HttpServletResponse
httpResponse
)
{
public
R
<
String
>
doPost
(
@RequestBody
PayPageDto
payPageDto
,
HttpServletRequest
request
,
HttpServletResponse
httpResponse
)
{
/*
public R<String> doPost(Integer userId,Integer payType,Integer total_amount, HttpServletRequest request, HttpServletResponse httpResponse) {
PayPageDto payPageDto = new PayPageDto();
payPageDto.setTotal(total_amount);
payPageDto.setUserId(userId);
payPageDto
.
setPayType
(
payType
);
payPageDto.setPayType(payType);
*/
return
aliPayService
.
doPost
(
payPageDto
,
request
,
httpResponse
);
}
@ApiOperation
(
value
=
"手机网页支付宝-支付接口"
,
notes
=
"手机网页支付宝-支付接口"
,
httpMethod
=
"POST"
)
@ApiImplicitParam
(
name
=
"payPageDto"
,
value
=
"参数"
,
dataType
=
"PayPageDto"
)
@PostMapping
(
"/wapAliPay"
)
public
R
<
String
>
wapAliPay
(
@RequestBody
PayPageDto
payPageDto
,
HttpServletRequest
request
,
HttpServletResponse
httpResponse
)
{
return
aliPayService
.
wapAliPay
(
payPageDto
,
request
,
httpResponse
);
}
@ApiOperation
(
value
=
"PC支付宝-交易查询"
,
notes
=
"PC支付宝-交易查询"
,
httpMethod
=
"POST"
)
@ApiImplicitParam
(
name
=
"payQueryDto"
,
value
=
"查询参数"
,
dataType
=
"PayQueryDto"
)
...
...
@@ -84,15 +91,15 @@ public class PayController {
*/
@ApiOperation
(
value
=
"支付回调"
,
notes
=
"支付回调"
,
httpMethod
=
"POST"
)
@RequestMapping
(
value
=
"/aliPayCallBack.do"
)
public
R
<
String
>
aliPayCallBack
(
HttpServletResponse
response
,
HttpServletRequest
request
)
{
return
aliPayService
.
aliPayCallBack
(
response
,
request
);
public
void
aliPayCallBack
(
HttpServletResponse
response
,
HttpServletRequest
request
)
throws
Exception
{
aliPayService
.
aliPayCallBack
(
response
,
request
);
}
@ApiOperation
(
value
=
"微行支付-统一下单测试"
,
notes
=
"微行支付-统一下单"
,
httpMethod
=
"POST"
)
@ApiImplicitParam
(
name
=
"payPageDto"
,
value
=
"支付入参"
,
dataType
=
"PayPageDto"
)
@PostMapping
(
"/wxPayTest"
)
public
R
<
String
>
wxPayTest
(
@RequestBody
PayPageDto
payPageDto
)
throws
AlipayApiException
,
UnsupportedEncodingException
,
InvalidKeySpecException
,
NoSuchAlgorithmException
,
InvalidKeyException
,
SignatureException
{
public
R
<
String
>
wxPayTest
(
@RequestBody
PayPageDto
payPageDto
)
throws
UnsupportedEncodingException
,
InvalidKeySpecException
,
NoSuchAlgorithmException
,
InvalidKeyException
,
SignatureException
{
return
wxPayService
.
wxPay
(
payPageDto
);
}
...
...
@@ -100,18 +107,17 @@ public class PayController {
@ApiOperation
(
value
=
"微信支付-交易查询"
,
notes
=
"微信支付-交易查询"
,
httpMethod
=
"POST"
)
@ApiImplicitParam
(
name
=
"payQueryDto"
,
value
=
"查询参数"
,
dataType
=
"PayQueryDto"
)
@PostMapping
(
"/queryWx"
)
public
R
<
String
>
queryWx
(
@RequestBody
PayQueryDto
payQueryDto
)
throws
AlipayApiException
,
InvalidKeySpecException
,
SignatureException
,
NoSuchAlgorithmException
,
InvalidKeyException
,
UnsupportedEncodingException
{
public
R
<
String
>
queryWx
(
@RequestBody
PayQueryDto
payQueryDto
)
throws
InvalidKeySpecException
,
SignatureException
,
NoSuchAlgorithmException
,
InvalidKeyException
,
UnsupportedEncodingException
{
if
(
null
==
payQueryDto
||
StringUtils
.
isBlank
(
payQueryDto
.
getOutTradeNo
()))
{
return
R
.
error
(
"操作错误!"
);
}
return
wxPayService
.
queryWx
(
payQueryDto
);
}
@ApiOperation
(
value
=
"测试-微行支付-统一下单"
,
notes
=
"测试-微行支付-统一下单"
,
httpMethod
=
"POST"
)
@ApiImplicitParam
(
name
=
"payPageDto"
,
value
=
"支付入参"
,
dataType
=
"PayPageDto"
)
@PostMapping
(
"/wx_Pay"
)
public
R
<
String
>
wx_Pay
(
@RequestBody
PayPageDto
payPageDto
)
throws
AlipayApiException
,
IOException
,
InvalidKeySpecException
,
NoSuchAlgorithmException
,
InvalidKeyException
,
SignatureException
,
IllegalBlockSizeException
{
public
R
<
String
>
wx_Pay
(
@RequestBody
PayPageDto
payPageDto
)
throws
IOException
,
InvalidKeySpecException
,
NoSuchAlgorithmException
,
InvalidKeyException
,
SignatureException
,
IllegalBlockSizeException
{
return
wxPayService
.
wx_Pay
(
payPageDto
);
}
...
...
@@ -122,6 +128,12 @@ public class PayController {
return
testWxPayService
.
wxPay
(
payPageDto
,
response
);
}
@ApiOperation
(
value
=
"h5微行支付-统一下单"
,
notes
=
"h5微行支付-统一下单"
,
httpMethod
=
"POST"
)
@ApiImplicitParam
(
name
=
"payPageDto"
,
value
=
"支付入参"
,
dataType
=
"PayPageDto"
)
@PostMapping
(
"/h5WxPay"
)
public
R
<
String
>
h5WxPay
(
@RequestBody
PayPageDto
payPageDto
,
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
JsonProcessingException
{
return
testWxPayService
.
h5WxPay
(
payPageDto
,
request
,
response
);
}
/**
* 微信回调函数
* 支付成功后微信服务器会调用此方法
...
...
wisenergy-web-admin/src/main/resources/application-dev.yml
View file @
741523ea
...
...
@@ -69,3 +69,13 @@ jwt:
expire
:
14400
logging
:
config
:
classpath:logback-spring.xml
#支付宝支付appid、支付宝公钥、应用私钥
aliPay
:
APP_ID
:
2021002126609937
ALIPAY_PUBLIC_KEY
:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2cUDFyw7sLpTpICDURNefRfzr7I7qO5Spq6HwdyFbVv5m6wVzt3fXYTcDrVUuzfbV7+rrXqnvk7LNOp10qPtUyHyZKO2jTBBcUK5H0RPNzs1XInKaSTAznGH8dEAk6yQiwhSDpQzwoOq1Ool2MQocdkcBWwAMEcEUByIbJ4ABsrwXdmkgu2hDHR/GgLvarUp1zOXfZkaTK//L1GUI5uCI+/omcqMPDIOwd8DfcNr0TKlXfAEixp9eVuU/b09b7vW7O9Vh+w0gmy5FN+BWX/JaRRL1DhRqbHl7Sl4/oGu1yjfQA5U8jXBgd+QjwdUiAXVwPdESS/AUbPWE517eH5FtQIDAQAB
PRIVATE_KEY
:
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCA9/p6UJH2kpTumbyRt/gdAOUnRJQ0VRQj/o0GtJ9ECweSIk6+8K81CAGcfmdeB6ZfteXZlKr9SGf3hkwuOz5oOJb5GAmKgv60T6zrBm5/MSVYhDY935eCYjFSj59w2120kvtWvq94Km3TkvAstrbSwBgpS4eutZ2qg1U4h5j6H3v+PB6RxyOsugarEYQ6TxCTr/CWHWU9G28yXSaQ66S3rsxl5aSpUCY+lUwIEVmZ9SyAa+g4FV3EfRitssiKMdCuli46YQ0/uxc59igCdgd4uxygswYgUGfP4HLQ5wEGPn7H4Q5IxSlxPvc60fYxgkRo9NMZgAljRohGdKP2u6jjAgMBAAECggEAGRakbljwHCRlvoi/qyU7qgC7k0j+/7MxSNNDAfPvK6Btp5ru8KwHmWxmS9g3KY6ZafMLtKj8HmuQdhF1DmVN/Z5MmEZ5zK0w+UiqncnRgwK/fhmyJ5Uwdxe8+o+f96dk8jTJmhVcMycl2Eu0Vy5wIE1oJdhgm7cO5dXIpUeTlcx09F3v2xx4lvmJTQvzPxgFYMbB7M8ijEQvkeXdBw7fAlA+izl8Paovgv6tu/dikImZZZgoHKZugZbz3orxpZWiIXzoB9SymBo+lWkeGMj55hlKV9sXTrf5pM6vd5JYmzfYoF/bcO7k4NJ0Elddz3EHe/0IX8M90rAH9WFSdLGseQKBgQDMkEPUfrWP/Z6nE76muUQE4y3OH0ckLacbCEI+RseVNqSKIs+TrzhQllvb/V/foeiv6SLBvmyWbO3AX+Gh9GuedLyRTct/K9o1J3Q4GAa8jGJeoi1uYPPAfqt3BMv05/i1jIvTePUrxp1NV7u0/i9QmV4R1it0+abs2Ro8Q3XqZwKBgQChZa3UBe4FbaTBWVToU4lW5KdEv93gm6iKQiHWI4yTXaJJlPOo8Hx9+/REeaxOIsaW6XZLyarNuh+cThTv4GLJKjogjcq9B1oNWgS6Z41CJZIkW/IFgjZvHh3n+SD3pTijA9y7usgu/R0OsVwrlAMyMvl7JdIMRYXFckRhb1v4JQKBgQC3+Ao4gZfRnjpfcd9k23rzlkfsdq6pN7FwGzZQAaGebNz/Kh1aaRuRRhfouW7OlTLJeTZ73UCU6/PJrbEi0Mk0YTHwz3DytsJwSUI47EqqqOoSx3FqMiEk/gZAbHzsjO5cf8CEd+St8Noo43z5Yhu1NainC+BbO+ZGXV0900GpgwKBgEEx2nK/5nLo5Fl55VNnkx23hV2/BzhYiE85AYQHnhxVAV4pvfcrFY6qfPRAFfsGDyQcsD1S/BzYJzazT7/J6v2JgituO0v6MUUdbLWDaMskdBEd1vikrapbBweSWd/PLL6kq8BlZcGdWuR5flrYEiZv8tjs4Rk16CBm1PpqykLFAoGASgkWQocPk0PYnEr1anXeiabc+/hMj4cZv3ynGv7NU9hUkZszMDKutG63y3nZ1QJPtfcF7xgTKpABfdIMCbAzKzDpd2znFg/bTxCV23GV6SNSWU+R8WC+30jw5o3W++wcILmd83L4IWLXUo6+GI0wqDBNOYG+nDLs1gWfBvX4UbI=
#微信支付appid、mchid、密钥
wxPay
:
APP_ID
:
wx7d8f4502a2bfa865
MCH_ID
:
1606042985
PRIVATE_KEY
:
efef4a06a1654e0f78d113377ea37aed
\ No newline at end of file
wisenergy-web-admin/wisenergy-web-admin.iml
View file @
741523ea
...
...
@@ -51,6 +51,8 @@
<orderEntry
type=
"library"
name=
"Maven: org.springframework:spring-expression:5.1.7.RELEASE"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: org.springframework.boot:spring-boot-starter-undertow:2.1.5.RELEASE"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: io.undertow:undertow-core:2.0.20.Final"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: org.jboss.xnio:xnio-api:3.3.8.Final"
level=
"project"
/>
<orderEntry
type=
"library"
scope=
"RUNTIME"
name=
"Maven: org.jboss.xnio:xnio-nio:3.3.8.Final"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: io.undertow:undertow-servlet:2.0.20.Final"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec:1.0.2.Final"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: io.undertow:undertow-websockets-jsr:2.0.20.Final"
level=
"project"
/>
...
...
@@ -150,6 +152,7 @@
<orderEntry
type=
"library"
name=
"Maven: org.bouncycastle:bcprov-jdk15on:1.62"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: com.squareup.okhttp3:okhttp:3.6.0"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: com.squareup.okio:okio:1.11.0"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: com.github.wxpay:wxpay-sdk:0.0.3"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: com.github.wechatpay-apiv3:wechatpay-apache-httpclient:0.2.1"
level=
"project"
/>
<orderEntry
type=
"library"
scope=
"RUNTIME"
name=
"Maven: org.apache.httpcomponents:httpmime:4.5.8"
level=
"project"
/>
<orderEntry
type=
"library"
name=
"Maven: com.fasterxml.jackson.core:jackson-databind:2.9.8"
level=
"project"
/>
...
...
Write
Preview
Markdown
is supported
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