| @@ -6,11 +6,10 @@ import java.io.Serializable; | |||||
| * jspai signature | * jspai signature | ||||
| */ | */ | ||||
| public class WxJsapiSignature implements Serializable { | public class WxJsapiSignature implements Serializable { | ||||
| private String appid; | |||||
| private String noncestr; | private String noncestr; | ||||
| private String jsapiTicket; | |||||
| private long timestamp; | private long timestamp; | ||||
| private String url; | private String url; | ||||
| @@ -33,14 +32,6 @@ public class WxJsapiSignature implements Serializable { | |||||
| this.noncestr = noncestr; | this.noncestr = noncestr; | ||||
| } | } | ||||
| public String getJsapiTicket() { | |||||
| return jsapiTicket; | |||||
| } | |||||
| public void setJsapiTicket(String jsapiTicket) { | |||||
| this.jsapiTicket = jsapiTicket; | |||||
| } | |||||
| public long getTimestamp() { | public long getTimestamp() { | ||||
| return timestamp; | return timestamp; | ||||
| } | } | ||||
| @@ -57,4 +48,12 @@ public class WxJsapiSignature implements Serializable { | |||||
| this.url = url; | this.url = url; | ||||
| } | } | ||||
| public String getAppid() { | |||||
| return appid; | |||||
| } | |||||
| public void setAppid(String appid) { | |||||
| this.appid = appid; | |||||
| } | |||||
| } | } | ||||
| @@ -543,7 +543,7 @@ public interface WxMpService { | |||||
| void setMaxRetryTimes(int maxRetryTimes); | void setMaxRetryTimes(int maxRetryTimes); | ||||
| /** | /** | ||||
| * 统一下单(详见http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=9_1) | |||||
| * 统一下单(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1) | |||||
| * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识" | * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识" | ||||
| * @param openId 支付人openId | * @param openId 支付人openId | ||||
| * @param outTradeNo 商户端对应订单号 | * @param outTradeNo 商户端对应订单号 | ||||
| @@ -570,4 +570,19 @@ public interface WxMpService { | |||||
| */ | */ | ||||
| Map<String, String> getJSSDKPayInfo(String openId, String outTradeNo, double amt, String body, String tradeType, String ip, String notifyUrl); | Map<String, String> getJSSDKPayInfo(String openId, String outTradeNo, double amt, String body, String tradeType, String ip, String notifyUrl); | ||||
| /** | |||||
| * 该接口提供所有微信支付订单的查询,当支付通知处理异常戒丢失的情冴,商户可以通过该接口查询订单支付状态。 | |||||
| * 详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2 | |||||
| * @param transactionId | |||||
| * @param outTradeNo | |||||
| */ | |||||
| WxMpPayResult getJSSDKPayResult(String transactionId, String outTradeNo); | |||||
| /** | |||||
| * 读取支付结果通知 | |||||
| * 详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7 | |||||
| * @param xmlData | |||||
| * @return | |||||
| */ | |||||
| WxMpPayCallback getJSSDKCallbackData(String xmlData); | |||||
| } | } | ||||
| @@ -162,6 +162,7 @@ public class WxMpServiceImpl implements WxMpService { | |||||
| "url=" + url | "url=" + url | ||||
| ); | ); | ||||
| WxJsapiSignature jsapiSignature = new WxJsapiSignature(); | WxJsapiSignature jsapiSignature = new WxJsapiSignature(); | ||||
| jsapiSignature.setAppid(wxMpConfigStorage.getAppId()); | |||||
| jsapiSignature.setTimestamp(timestamp); | jsapiSignature.setTimestamp(timestamp); | ||||
| jsapiSignature.setNoncestr(noncestr); | jsapiSignature.setNoncestr(noncestr); | ||||
| jsapiSignature.setUrl(url); | jsapiSignature.setUrl(url); | ||||
| @@ -792,4 +793,61 @@ public class WxMpServiceImpl implements WxMpService { | |||||
| payInfo.put("sign", finalSign); | payInfo.put("sign", finalSign); | ||||
| return payInfo; | return payInfo; | ||||
| } | } | ||||
| @Override | |||||
| public WxMpPayResult getJSSDKPayResult(String transactionId, String outTradeNo) { | |||||
| String nonce_str = System.currentTimeMillis() + ""; | |||||
| SortedMap<String, String> packageParams = new TreeMap<String, String>(); | |||||
| packageParams.put("appid", wxMpConfigStorage.getAppId()); | |||||
| packageParams.put("mch_id", wxMpConfigStorage.getPartnerId()); | |||||
| packageParams.put("transaction_id", transactionId); | |||||
| packageParams.put("out_trade_no", outTradeNo); | |||||
| packageParams.put("nonce_str", nonce_str); | |||||
| String sign = WxCryptUtil.createSign(packageParams, wxMpConfigStorage.getPartnerKey()); | |||||
| String xml = "<xml>" + | |||||
| "<appid>" + wxMpConfigStorage.getAppId() + "</appid>" + | |||||
| "<mch_id>" + wxMpConfigStorage.getPartnerId() + "</mch_id>" + | |||||
| "<transaction_id>" + transactionId + "</transaction_id>" + | |||||
| "<out_trade_no>" + outTradeNo + "</out_trade_no>" + | |||||
| "<nonce_str>" + nonce_str + "</nonce_str>" + | |||||
| "<sign>" + sign + "</sign>" + | |||||
| "</xml>"; | |||||
| HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/pay/orderquery"); | |||||
| if (httpProxy != null) { | |||||
| RequestConfig config = RequestConfig.custom().setProxy(httpProxy).build(); | |||||
| httpPost.setConfig(config); | |||||
| } | |||||
| StringEntity entity = new StringEntity(xml, Consts.UTF_8); | |||||
| httpPost.setEntity(entity); | |||||
| try { | |||||
| CloseableHttpResponse response = httpClient.execute(httpPost); | |||||
| String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response); | |||||
| XStream xstream = XStreamInitializer.getInstance(); | |||||
| xstream.alias("xml", WxMpPayResult.class); | |||||
| WxMpPayResult wxMpPayResult = (WxMpPayResult) xstream.fromXML(responseContent); | |||||
| return wxMpPayResult; | |||||
| } catch (IOException e) { | |||||
| e.printStackTrace(); | |||||
| } | |||||
| return new WxMpPayResult(); | |||||
| } | |||||
| @Override | |||||
| public WxMpPayCallback getJSSDKCallbackData(String xmlData) { | |||||
| try { | |||||
| XStream xstream = XStreamInitializer.getInstance(); | |||||
| xstream.alias("xml", WxMpPayResult.class); | |||||
| WxMpPayCallback wxMpCallback = (WxMpPayCallback) xstream.fromXML(xmlData); | |||||
| return wxMpCallback; | |||||
| } catch (Exception e){ | |||||
| e.printStackTrace(); | |||||
| } | |||||
| return new WxMpPayCallback(); | |||||
| } | |||||
| } | } | ||||
| @@ -0,0 +1,260 @@ | |||||
| package me.chanjar.weixin.mp.bean.result; | |||||
| import java.io.Serializable; | |||||
| /** | |||||
| * pre> 订单支付状态回调 | |||||
| * | |||||
| * 支付结果通知(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7) | |||||
| * | |||||
| * /pre> | |||||
| * | |||||
| * @author ukid | |||||
| */ | |||||
| public class WxMpPayCallback implements Serializable { | |||||
| private String return_code; | |||||
| private String return_msg; | |||||
| private String appid; | |||||
| private String mch_id; | |||||
| private String device_info; | |||||
| private String nonce_str; | |||||
| private String sign; | |||||
| private String result_code; | |||||
| private String err_code; | |||||
| private String err_code_des; | |||||
| private String openid; | |||||
| private String is_subscribe; | |||||
| private String trade_type; | |||||
| private String bank_type; | |||||
| private String total_fee; | |||||
| private String fee_type; | |||||
| private String cash_fee; | |||||
| private String cash_fee_type; | |||||
| private String coupon_fee; | |||||
| private String coupon_count; | |||||
| private String coupon_batch_id_$n; | |||||
| private String coupon_id_$n; | |||||
| private String coupon_fee_$n; | |||||
| private String transaction_id; | |||||
| private String out_trade_no; | |||||
| private String attach; | |||||
| private String time_end; | |||||
| public String getReturn_code() { | |||||
| return return_code; | |||||
| } | |||||
| public String getReturn_msg() { | |||||
| return return_msg; | |||||
| } | |||||
| public String getAppid() { | |||||
| return appid; | |||||
| } | |||||
| public String getMch_id() { | |||||
| return mch_id; | |||||
| } | |||||
| public String getDevice_info() { | |||||
| return device_info; | |||||
| } | |||||
| public String getNonce_str() { | |||||
| return nonce_str; | |||||
| } | |||||
| public String getSign() { | |||||
| return sign; | |||||
| } | |||||
| public String getResult_code() { | |||||
| return result_code; | |||||
| } | |||||
| public String getErr_code() { | |||||
| return err_code; | |||||
| } | |||||
| public String getErr_code_des() { | |||||
| return err_code_des; | |||||
| } | |||||
| public String getOpenid() { | |||||
| return openid; | |||||
| } | |||||
| public String getIs_subscribe() { | |||||
| return is_subscribe; | |||||
| } | |||||
| public String getTrade_type() { | |||||
| return trade_type; | |||||
| } | |||||
| public String getBank_type() { | |||||
| return bank_type; | |||||
| } | |||||
| public String getTotal_fee() { | |||||
| return total_fee; | |||||
| } | |||||
| public String getFee_type() { | |||||
| return fee_type; | |||||
| } | |||||
| public String getCash_fee() { | |||||
| return cash_fee; | |||||
| } | |||||
| public String getCash_fee_type() { | |||||
| return cash_fee_type; | |||||
| } | |||||
| public String getCoupon_fee() { | |||||
| return coupon_fee; | |||||
| } | |||||
| public String getCoupon_count() { | |||||
| return coupon_count; | |||||
| } | |||||
| public String getCoupon_batch_id_$n() { | |||||
| return coupon_batch_id_$n; | |||||
| } | |||||
| public String getCoupon_id_$n() { | |||||
| return coupon_id_$n; | |||||
| } | |||||
| public String getCoupon_fee_$n() { | |||||
| return coupon_fee_$n; | |||||
| } | |||||
| public String getTransaction_id() { | |||||
| return transaction_id; | |||||
| } | |||||
| public String getOut_trade_no() { | |||||
| return out_trade_no; | |||||
| } | |||||
| public String getAttach() { | |||||
| return attach; | |||||
| } | |||||
| public String getTime_end() { | |||||
| return time_end; | |||||
| } | |||||
| public void setReturn_code(String return_code) { | |||||
| this.return_code = return_code; | |||||
| } | |||||
| public void setReturn_msg(String return_msg) { | |||||
| this.return_msg = return_msg; | |||||
| } | |||||
| public void setAppid(String appid) { | |||||
| this.appid = appid; | |||||
| } | |||||
| public void setMch_id(String mch_id) { | |||||
| this.mch_id = mch_id; | |||||
| } | |||||
| public void setDevice_info(String device_info) { | |||||
| this.device_info = device_info; | |||||
| } | |||||
| public void setNonce_str(String nonce_str) { | |||||
| this.nonce_str = nonce_str; | |||||
| } | |||||
| public void setSign(String sign) { | |||||
| this.sign = sign; | |||||
| } | |||||
| public void setResult_code(String result_code) { | |||||
| this.result_code = result_code; | |||||
| } | |||||
| public void setErr_code(String err_code) { | |||||
| this.err_code = err_code; | |||||
| } | |||||
| public void setErr_code_des(String err_code_des) { | |||||
| this.err_code_des = err_code_des; | |||||
| } | |||||
| public void setOpenid(String openid) { | |||||
| this.openid = openid; | |||||
| } | |||||
| public void setIs_subscribe(String is_subscribe) { | |||||
| this.is_subscribe = is_subscribe; | |||||
| } | |||||
| public void setTrade_type(String trade_type) { | |||||
| this.trade_type = trade_type; | |||||
| } | |||||
| public void setBank_type(String bank_type) { | |||||
| this.bank_type = bank_type; | |||||
| } | |||||
| public void setTotal_fee(String total_fee) { | |||||
| this.total_fee = total_fee; | |||||
| } | |||||
| public void setFee_type(String fee_type) { | |||||
| this.fee_type = fee_type; | |||||
| } | |||||
| public void setCash_fee(String cash_fee) { | |||||
| this.cash_fee = cash_fee; | |||||
| } | |||||
| public void setCash_fee_type(String cash_fee_type) { | |||||
| this.cash_fee_type = cash_fee_type; | |||||
| } | |||||
| public void setCoupon_fee(String coupon_fee) { | |||||
| this.coupon_fee = coupon_fee; | |||||
| } | |||||
| public void setCoupon_count(String coupon_count) { | |||||
| this.coupon_count = coupon_count; | |||||
| } | |||||
| public void setCoupon_batch_id_$n(String coupon_batch_id_$n) { | |||||
| this.coupon_batch_id_$n = coupon_batch_id_$n; | |||||
| } | |||||
| public void setCoupon_id_$n(String coupon_id_$n) { | |||||
| this.coupon_id_$n = coupon_id_$n; | |||||
| } | |||||
| public void setCoupon_fee_$n(String coupon_fee_$n) { | |||||
| this.coupon_fee_$n = coupon_fee_$n; | |||||
| } | |||||
| public void setTransaction_id(String transaction_id) { | |||||
| this.transaction_id = transaction_id; | |||||
| } | |||||
| public void setOut_trade_no(String out_trade_no) { | |||||
| this.out_trade_no = out_trade_no; | |||||
| } | |||||
| public void setAttach(String attach) { | |||||
| this.attach = attach; | |||||
| } | |||||
| public void setTime_end(String time_end) { | |||||
| this.time_end = time_end; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,215 @@ | |||||
| package me.chanjar.weixin.mp.bean.result; | |||||
| import java.io.Serializable; | |||||
| /** | |||||
| * <pre> | |||||
| * 查询订单支付状态返回的结果 | |||||
| * | |||||
| * 查询订单(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2) | |||||
| * | |||||
| * </pre> | |||||
| * | |||||
| * @author ukid | |||||
| */ | |||||
| public class WxMpPayResult implements Serializable { | |||||
| private String return_code; | |||||
| private String return_msg; | |||||
| private String appid; | |||||
| private String mch_id; | |||||
| private String nonce_str; | |||||
| private String sign; | |||||
| private String result_code; | |||||
| private String err_code; | |||||
| private String err_code_des; | |||||
| private String trade_state; | |||||
| private String device_info; | |||||
| private String openid; | |||||
| private String is_subscribe; | |||||
| private String trade_type; | |||||
| private String bank_type; | |||||
| private String total_fee; | |||||
| private String coupon_fee; | |||||
| private String fee_type; | |||||
| private String transaction_id; | |||||
| private String out_trade_no; | |||||
| private String attach; | |||||
| private String time_end; | |||||
| public String getReturn_code() { | |||||
| return return_code; | |||||
| } | |||||
| public String getReturn_msg() { | |||||
| return return_msg; | |||||
| } | |||||
| public String getAppid() { | |||||
| return appid; | |||||
| } | |||||
| public String getMch_id() { | |||||
| return mch_id; | |||||
| } | |||||
| public String getNonce_str() { | |||||
| return nonce_str; | |||||
| } | |||||
| public String getSign() { | |||||
| return sign; | |||||
| } | |||||
| public String getResult_code() { | |||||
| return result_code; | |||||
| } | |||||
| public String getErr_code() { | |||||
| return err_code; | |||||
| } | |||||
| public String getErr_code_des() { | |||||
| return err_code_des; | |||||
| } | |||||
| public String getTrade_state() { | |||||
| return trade_state; | |||||
| } | |||||
| public String getDevice_info() { | |||||
| return device_info; | |||||
| } | |||||
| public String getOpenid() { | |||||
| return openid; | |||||
| } | |||||
| public String getIs_subscribe() { | |||||
| return is_subscribe; | |||||
| } | |||||
| public String getTrade_type() { | |||||
| return trade_type; | |||||
| } | |||||
| public String getBank_type() { | |||||
| return bank_type; | |||||
| } | |||||
| public String getTotal_fee() { | |||||
| return total_fee; | |||||
| } | |||||
| public String getCoupon_fee() { | |||||
| return coupon_fee; | |||||
| } | |||||
| public String getFee_type() { | |||||
| return fee_type; | |||||
| } | |||||
| public String getTransaction_id() { | |||||
| return transaction_id; | |||||
| } | |||||
| public String getOut_trade_no() { | |||||
| return out_trade_no; | |||||
| } | |||||
| public String getAttach() { | |||||
| return attach; | |||||
| } | |||||
| public String getTime_end() { | |||||
| return time_end; | |||||
| } | |||||
| public void setReturn_code(String return_code) { | |||||
| this.return_code = return_code; | |||||
| } | |||||
| public void setReturn_msg(String return_msg) { | |||||
| this.return_msg = return_msg; | |||||
| } | |||||
| public void setAppid(String appid) { | |||||
| this.appid = appid; | |||||
| } | |||||
| public void setMch_id(String mch_id) { | |||||
| this.mch_id = mch_id; | |||||
| } | |||||
| public void setNonce_str(String nonce_str) { | |||||
| this.nonce_str = nonce_str; | |||||
| } | |||||
| public void setSign(String sign) { | |||||
| this.sign = sign; | |||||
| } | |||||
| public void setResult_code(String result_code) { | |||||
| this.result_code = result_code; | |||||
| } | |||||
| public void setErr_code(String err_code) { | |||||
| this.err_code = err_code; | |||||
| } | |||||
| public void setErr_code_des(String err_code_des) { | |||||
| this.err_code_des = err_code_des; | |||||
| } | |||||
| public void setTrade_state(String trade_state) { | |||||
| this.trade_state = trade_state; | |||||
| } | |||||
| public void setDevice_info(String device_info) { | |||||
| this.device_info = device_info; | |||||
| } | |||||
| public void setOpenid(String openid) { | |||||
| this.openid = openid; | |||||
| } | |||||
| public void setIs_subscribe(String is_subscribe) { | |||||
| this.is_subscribe = is_subscribe; | |||||
| } | |||||
| public void setTrade_type(String trade_type) { | |||||
| this.trade_type = trade_type; | |||||
| } | |||||
| public void setBank_type(String bank_type) { | |||||
| this.bank_type = bank_type; | |||||
| } | |||||
| public void setTotal_fee(String total_fee) { | |||||
| this.total_fee = total_fee; | |||||
| } | |||||
| public void setCoupon_fee(String coupon_fee) { | |||||
| this.coupon_fee = coupon_fee; | |||||
| } | |||||
| public void setFee_type(String fee_type) { | |||||
| this.fee_type = fee_type; | |||||
| } | |||||
| public void setTransaction_id(String transaction_id) { | |||||
| this.transaction_id = transaction_id; | |||||
| } | |||||
| public void setOut_trade_no(String out_trade_no) { | |||||
| this.out_trade_no = out_trade_no; | |||||
| } | |||||
| public void setAttach(String attach) { | |||||
| this.attach = attach; | |||||
| } | |||||
| public void setTime_end(String time_end) { | |||||
| this.time_end = time_end; | |||||
| } | |||||
| } | |||||
| @@ -4,10 +4,9 @@ import java.io.Serializable; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| * 群发消息一发送就返回的结果 | |||||
| * 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识"返回的结果 | |||||
| * | * | ||||
| * 真正的群发消息是否发送成功要看 | |||||
| * http://mp.weixin.qq.com/wiki/index.php?title=高级群发接口#.E4.BA.8B.E4.BB.B6.E6.8E.A8.E9.80.81.E7.BE.A4.E5.8F.91.E7.BB.93.E6.9E.9C | |||||
| * 统一下单(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1) | |||||
| * | * | ||||
| * </pre> | * </pre> | ||||
| * | * | ||||