controller层
@RestController
@RequestMapping ( "/order/log" )
@Api ( description = "二维码操作" )
public class TPayLogController {
@Autowired
private TPayLogService tPayLogService;
@ApiOperation ( value = "生成微信支付二维码" )
@GetMapping ( "/createNative/{orderNo}" )
public Msg createNative ( @PathVariable ( "orderNo" ) String orderNo) {
Map map = tPayLogService. createNative ( orderNo) ;
return Msg . success ( ) . data ( map) ;
}
@ApiOperation ( value = "根据订单id确认支付状态" )
@GetMapping ( "/queryPayStatus/{orderNo}" )
public Msg queryPayStatus ( @PathVariable String orderNo) {
Map < String , String > map= tPayLogService. queryPayStatus ( orderNo) ;
if ( map == null ) {
return Msg . error ( ) . message ( "支付出错了" ) ;
}
if ( map. get ( "trade_state" ) . equals ( "SUCCESS" ) ) {
tPayLogService. updateOrdersStatus ( map) ;
return Msg . success ( ) . message ( "支付成功" ) ;
}
return Msg . success ( ) . code ( 25000 ) . message ( "支付中" ) ;
}
}
service层
public interface TPayLogService extends IService < TPayLog > {
Map createNative ( String orderNo) ;
Map < String , String > queryPayStatus ( String orderNo) ;
void updateOrdersStatus ( Map < String , String > map) ;
}
实现service层
@Service
public class TPayLogServiceImpl extends ServiceImpl < TPayLogMapper , TPayLog > implements TPayLogService {
@Autowired
private TOrderService orderService;
@Override
public Map createNative ( String orderNo) {
try {
QueryWrapper < TOrder > wrapper = new QueryWrapper < > ( ) ;
wrapper. eq ( "order_no" , orderNo) ;
TOrder order = orderService. getOne ( wrapper) ;
Map m = new HashMap ( ) ;
m. put ( "appid" , "wx74862e0dfcf69954" ) ;
m. put ( "mch_id" , "1558950191" ) ;
m. put ( "nonce_str" , WXPayUtil . generateNonceStr ( ) ) ;
m. put ( "body" , order. getCourseTitle ( ) ) ;
m. put ( "out_trade_no" , orderNo) ;
m. put ( "total_fee" , order. getTotalFee ( ) . multiply ( new BigDecimal ( "100" ) ) . longValue ( ) + "" ) ;
m. put ( "spbill_create_ip" , "127.0.0.1" ) ;
m. put ( "notify_url" , "http://guli.shop/api/order/weixinPay/weixinNotify\n" ) ;
m. put ( "trade_type" , "NATIVE" ) ;
HttpClient client = new HttpClient ( "https://api.mch.weixin.qq.com/pay/unifiedorder" ) ;
client. setXmlParam ( WXPayUtil . generateSignedXml ( m, "T6m9iK73b0kn9g5v426MKfHQH7X8rKwb" ) ) ;
client. setHttps ( true ) ;
client. post ( ) ;
String xml = client. getContent ( ) ;
Map < String , String > resultMap = WXPayUtil . xmlToMap ( xml) ;
Map map = new HashMap ( ) ;
map. put ( "out_trade_no" , orderNo) ;
map. put ( "course_id" , order. getCourseId ( ) ) ;
map. put ( "total_fee" , order. getTotalFee ( ) ) ;
map. put ( "result_code" , resultMap. get ( "result_code" ) ) ;
map. put ( "code_url" , resultMap. get ( "code_url" ) ) ;
return map;
} catch ( Exception e) {
throw new GuliException ( 20001 , "生成二维码失败" ) ;
}
}
@Override
public Map < String , String > queryPayStatus ( String orderNo) {
try {
Map m = new HashMap < > ( ) ;
m. put ( "appid" , "wx74862e0dfcf69954" ) ;
m. put ( "mch_id" , "1558950191" ) ;
m. put ( "out_trade_no" , orderNo) ;
m. put ( "nonce_str" , WXPayUtil . generateNonceStr ( ) ) ;
HttpClient client = new HttpClient ( "https://api.mch.weixin.qq.com/pay/orderquery" ) ;
client. setXmlParam ( WXPayUtil . generateSignedXml ( m, "T6m9iK73b0kn9g5v426MKfHQH7X8rKwb" ) ) ;
client. setHttps ( true ) ;
client. post ( ) ;
String xml = client. getContent ( ) ;
Map < String , String > resultMap = WXPayUtil . xmlToMap ( xml) ;
return resultMap;
} catch ( Exception e) {
return null ;
}
}
@Override
public void updateOrdersStatus ( Map < String , String > map) {
String orderNo = map. get ( "out_trade_no" ) ;
QueryWrapper < TOrder > wrapper = new QueryWrapper < > ( ) ;
wrapper. eq ( "order_no" , orderNo) ;
TOrder order = orderService. getOne ( wrapper) ;
if ( order. getStatus ( ) . intValue ( ) == 1 ) { return ; }
order. setStatus ( 1 ) ;
orderService. updateById ( order) ;
TPayLog payLog = new TPayLog ( ) ;
payLog. setOrderNo ( orderNo) ;
payLog. setPayTime ( new Date ( ) ) ;
payLog. setPayType ( 1 ) ;
payLog. setTotalFee ( order. getTotalFee ( ) ) ;
payLog. setTradeState ( map. get ( "trade_state" ) ) ;
payLog. setTransactionId ( map. get ( "transaction_id" ) ) ;
payLog. setAttr ( JSONObject . toJSONString ( map) ) ;
baseMapper. insert ( payLog) ;
}
}
工具类 httpClient
ublic class HttpClient {
private String url;
private Map < String , String > param;
private int statusCode;
private String content;
private String xmlParam;
private boolean isHttps;
public boolean isHttps ( ) {
return isHttps;
}
public void setHttps ( boolean isHttps) {
this . isHttps = isHttps;
}
public String getXmlParam ( ) {
return xmlParam;
}
public void setXmlParam ( String xmlParam) {
this . xmlParam = xmlParam;
}
public HttpClient ( String url, Map < String , String > param) {
this . url = url;
this . param = param;
}
public HttpClient ( String url) {
this . url = url;
}
public void setParameter ( Map < String , String > map) {
param = map;
}
public void addParameter ( String key, String value) {
if ( param == null )
param = new HashMap < String , String > ( ) ;
param. put ( key, value) ;
}
public void post ( ) throws ClientProtocolException , IOException {
HttpPost http = new HttpPost ( url) ;
setEntity ( http) ;
execute ( http) ;
}
public void put ( ) throws ClientProtocolException , IOException {
HttpPut http = new HttpPut ( url) ;
setEntity ( http) ;
execute ( http) ;
}
public void get ( ) throws ClientProtocolException , IOException {
if ( param != null ) {
StringBuilder url = new StringBuilder ( this . url) ;
boolean isFirst = true ;
for ( String key : param. keySet ( ) ) {
if ( isFirst)
url. append ( "?" ) ;
else
url. append ( "&" ) ;
url. append ( key) . append ( "=" ) . append ( param. get ( key) ) ;
}
this . url = url. toString ( ) ;
}
HttpGet http = new HttpGet ( url) ;
execute ( http) ;
}
private void setEntity ( HttpEntityEnclosingRequestBase http) {
if ( param != null ) {
List < NameValuePair > nvps = new LinkedList < NameValuePair > ( ) ;
for ( String key : param. keySet ( ) )
nvps. add ( new BasicNameValuePair ( key, param. get ( key) ) ) ;
http. setEntity ( new UrlEncodedFormEntity ( nvps, Consts . UTF_8) ) ;
}
if ( xmlParam != null ) {
http. setEntity ( new StringEntity ( xmlParam, Consts . UTF_8) ) ;
}
}
private void execute ( HttpUriRequest http) throws ClientProtocolException ,
IOException {
CloseableHttpClient httpClient = null ;
try {
if ( isHttps) {
SSLContext sslContext = new SSLContextBuilder ( )
. loadTrustMaterial ( null , new TrustStrategy ( ) {
public boolean isTrusted ( X509Certificate [ ] chain,
String authType)
throws CertificateException {
return true ;
}
} ) . build ( ) ;
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory (
sslContext) ;
httpClient = HttpClients . custom ( ) . setSSLSocketFactory ( sslsf)
. build ( ) ;
} else {
httpClient = HttpClients . createDefault ( ) ;
}
CloseableHttpResponse response = httpClient. execute ( http) ;
try {
if ( response != null ) {
if ( response. getStatusLine ( ) != null )
statusCode = response. getStatusLine ( ) . getStatusCode ( ) ;
HttpEntity entity = response. getEntity ( ) ;
content = EntityUtils . toString ( entity, Consts . UTF_8) ;
}
} finally {
response. close ( ) ;
}
} catch ( Exception e) {
e. printStackTrace ( ) ;
} finally {
httpClient. close ( ) ;
}
}
public int getStatusCode ( ) {
return statusCode;
}
public String getContent ( ) throws ParseException , IOException {
return content;
}
}
生成订单工具类
public static String getOrderNo ( ) {
SimpleDateFormat sdf = new SimpleDateFormat ( "yyyyMMddHHmmss" ) ;
String newDate = sdf. format ( new Date ( ) ) ;
String result = "" ;
Random random = new Random ( ) ;
for ( int i = 0 ; i < 3 ; i++ ) {
result += random. nextInt ( 10 ) ;
}
return newDate + result;
}