diff --git a/README.md b/README.md
index 48d419e1..20ef6129 100644
--- a/README.md
+++ b/README.md
@@ -75,7 +75,7 @@ weixin4j
* [微信门店](http://mp.weixin.qq.com/wiki/11/081986f089826bf94393bef9bf287b8b.html)
-* [微信摇一摇周边](http://mp.weixin.qq.com/wiki/19/9fe9fdbb50fee9f9660438c551142ccf.html)
+* [微信摇一摇](http://mp.weixin.qq.com/wiki/19/9fe9fdbb50fee9f9660438c551142ccf.html)
* [微信连WI-FI](http://mp.weixin.qq.com/wiki/9/fd2d692e28b938a8d618f57cf9c79fb1.html)
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/Pay3Api.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/Pay3Api.java
index b5d3988b..c320df0d 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/Pay3Api.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/Pay3Api.java
@@ -34,6 +34,7 @@ import com.foxinmy.weixin4j.payment.mch.JSAPIPayRequest;
import com.foxinmy.weixin4j.payment.mch.MchPayPackage;
import com.foxinmy.weixin4j.payment.mch.MchPayRequest;
import com.foxinmy.weixin4j.payment.mch.NATIVEPayRequest;
+import com.foxinmy.weixin4j.payment.mch.NativePayResponse;
import com.foxinmy.weixin4j.payment.mch.Order;
import com.foxinmy.weixin4j.payment.mch.PrePay;
import com.foxinmy.weixin4j.payment.mch.RefundRecord;
@@ -290,6 +291,38 @@ public class Pay3Api {
timestamp, noncestr);
}
+ /**
+ * 创建Native支付(扫码支付)回调对象【模式一】
+ *
+ * @param productId
+ * 商品ID
+ * @param body
+ * 商品描述
+ * @param outTradeNo
+ * 商户内部唯一订单号
+ * @param totalFee
+ * 商品总额 单位元
+ * @param notifyUrl
+ * 支付回调URL
+ * @param createIp
+ * 订单生成的机器 IP
+ * @return Native回调对象
+ * @see com.foxinmy.weixin4j.payment.mch.NativePayResponse
+ * @see 扫码支付
+ * @see 模式一
+ * @throws WeixinPayException
+ */
+ public NativePayResponse createNativePayResponse(String productId,
+ String body, String outTradeNo, double totalFee, String notifyUrl,
+ String createIp) throws WeixinPayException {
+ MchPayPackage payPackage = new MchPayPackage(weixinAccount, null, body,
+ outTradeNo, totalFee, notifyUrl, createIp, TradeType.NATIVE);
+ payPackage.setProductId(productId);
+ PrePay prePay = createPrePay(payPackage);
+ return new NativePayResponse(weixinAccount, prePay.getPrepayId());
+ }
+
/**
* 创建Native支付(扫码支付)链接【模式二】
*
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/PayBaseInfo.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/PayBaseInfo.java
index 07756d3c..4da90e04 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/PayBaseInfo.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/PayBaseInfo.java
@@ -6,6 +6,7 @@ import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
import com.alibaba.fastjson.annotation.JSONField;
import com.foxinmy.weixin4j.type.SignType;
@@ -92,6 +93,7 @@ public class PayBaseInfo implements Serializable {
return signType;
}
+ @XmlTransient
@JSONField(serialize = false)
public SignType getFormatSignType() {
return signType != null ? SignType.valueOf(signType.toUpperCase())
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/PayRequest.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/PayRequest.java
index 91113ad3..cdd48b7a 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/PayRequest.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/PayRequest.java
@@ -36,8 +36,8 @@ public class PayRequest extends PayBaseInfo {
@JSONField(serialize = false)
private String partnerId;
- public PayRequest() {
- super(null, DateUtil.timestamp2string(), RandomUtil.generateString(16));
+ protected PayRequest() {
+ // jaxb required
}
public PayRequest(String appId, String packageInfo) {
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/WeixinPayProxy.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/WeixinPayProxy.java
index cf9e04d8..360f8e4d 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/WeixinPayProxy.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/WeixinPayProxy.java
@@ -24,6 +24,7 @@ import com.foxinmy.weixin4j.payment.mch.MPPaymentRecord;
import com.foxinmy.weixin4j.payment.mch.MPPaymentResult;
import com.foxinmy.weixin4j.payment.mch.MchPayPackage;
import com.foxinmy.weixin4j.payment.mch.MchPayRequest;
+import com.foxinmy.weixin4j.payment.mch.NativePayResponse;
import com.foxinmy.weixin4j.payment.mch.Order;
import com.foxinmy.weixin4j.payment.mch.PrePay;
import com.foxinmy.weixin4j.payment.mch.Redpacket;
@@ -237,6 +238,36 @@ public class WeixinPayProxy {
return pay3Api.createNativePayRequestURL(productId);
}
+ /**
+ * 创建Native支付(扫码支付)回调对象【模式一】
+ *
+ * @param productId
+ * 商品ID
+ * @param body
+ * 商品描述
+ * @param outTradeNo
+ * 商户内部唯一订单号
+ * @param totalFee
+ * 商品总额 单位元
+ * @param notifyUrl
+ * 支付回调URL
+ * @param createIp
+ * 订单生成的机器 IP
+ * @return Native回调对象
+ * @see com.foxinmy.weixin4j.api.Pay3Api
+ * @see com.foxinmy.weixin4j.payment.mch.NativePayResponse
+ * @see 扫码支付
+ * @see 模式一
+ * @throws WeixinPayException
+ */
+ public NativePayResponse createNativePayResponse(String productId,
+ String body, String outTradeNo, double totalFee, String notifyUrl,
+ String createIp) throws WeixinPayException {
+ return pay3Api.createNativePayResponse(productId, body, outTradeNo,
+ totalFee, notifyUrl, createIp);
+ }
+
/**
* 创建Native支付(扫码支付)链接【模式二】
*
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/NativePayResponse.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/NativePayResponse.java
index 2f6ab034..20577d18 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/NativePayResponse.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/payment/mch/NativePayResponse.java
@@ -4,7 +4,6 @@ import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
import com.alibaba.fastjson.annotation.JSONField;
import com.foxinmy.weixin4j.exception.WeixinPayException;
@@ -12,7 +11,6 @@ import com.foxinmy.weixin4j.model.Consts;
import com.foxinmy.weixin4j.model.WeixinPayAccount;
import com.foxinmy.weixin4j.util.DigestUtil;
import com.foxinmy.weixin4j.util.RandomUtil;
-import com.foxinmy.weixin4j.xml.XmlStream;
/**
* Native支付时的回调响应
@@ -33,10 +31,6 @@ public class NativePayResponse extends ApiResult {
@JSONField(name = "prepay_id")
private String prepayId;
- @XmlTransient
- @JSONField(serialize = false)
- private WeixinPayAccount weixinAccount;
-
protected NativePayResponse() {
// jaxb required
}
@@ -44,21 +38,17 @@ public class NativePayResponse extends ApiResult {
/**
* 作为return_code 为 FAIL 的时候返回
*
- * @param weixinAccount
- * 商户信息
* @param returnMsg
* 失败消息
* @param resultMsg
* 结果消息
* @throws WeixinPayException
*/
- public NativePayResponse(WeixinPayAccount weixinAccount, String returnMsg,
- String resultMsg) {
+ public NativePayResponse(String returnMsg, String resultMsg) {
super.setReturnMsg(returnMsg);
super.setReturnCode(Consts.FAIL);
super.setErrCodeDes(resultMsg);
super.setResultCode(Consts.FAIL);
- this.weixinAccount = weixinAccount;
}
/**
@@ -77,27 +67,13 @@ public class NativePayResponse extends ApiResult {
this.setAppId(weixinAccount.getId());
this.setNonceStr(RandomUtil.generateString(16));
this.prepayId = prepayId;
- this.weixinAccount = weixinAccount;
+ this.setSign(DigestUtil.paysignMd5(this, weixinAccount.getPaySignKey()));
}
public String getPrepayId() {
return prepayId;
}
- /**
- * 生成 回调字符串
- *
- * @param paySignKey
- * 支付签名密钥
- * @return native回调字符串
- */
- @XmlTransient
- @JSONField(serialize = false)
- public String asRequestXml() {
- this.setSign(DigestUtil.paysignMd5(this, weixinAccount.getPaySignKey()));
- return XmlStream.toXML(this);
- }
-
@Override
public String toString() {
return "NativePayResponse [prepayId=" + prepayId + ", "
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay2Api.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay2Api.java
index e8120ab1..5345080c 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay2Api.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/Pay2Api.java
@@ -171,10 +171,9 @@ public class Pay2Api extends MpApi {
map.put("productid", productId);
map.put("appkey", weixinAccount.getPaySignKey());
String sign = DigestUtil.paysignSha(map, null);
- return String
- .format("weixin://wxpay/bizpayurl?sign=%s&appid=%s&productid=%s×tamp=%s&nocestr=%s",
- sign, weixinAccount.getId(), productId, timestamp,
- noncestr);
+ String ordernative_v2_uri = getRequestUri("ordernative_v2_uri");
+ return String.format(ordernative_v2_uri, sign, weixinAccount.getId(),
+ productId, timestamp, noncestr);
}
/**
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/weixin.properties b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/weixin.properties
index eae20688..68c1e573 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/weixin.properties
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/weixin.properties
@@ -1,4 +1,3 @@
-# ----------------------------------------------------------------------------
# \u5fae\u4fe1\u516c\u4f17\u5e73\u53f0\u6587\u6863\u8bf4\u660e
# http://mp.weixin.qq.com/wiki/index.php
# http://mp.weixin.qq.com/wiki/0/2e2239fa5f49388d5b5136ecc8e0e440.html
@@ -130,6 +129,8 @@ getcallbackip_uri={api_cgi_url}/getcallbackip?access_token=%s
# v2\u8ba2\u5355\u67e5\u8be2
orderquery_v2_uri={api_base_url}/pay/orderquery?access_token=%s
+# v2native\u652f\u4ed8
+ordernative_v2_uri=weixin://wxpay/bizpayurl?sign=%s&appid=%s&productid=%s×tamp=%s&nocestr=%s\udbff\udce0\udbff\udce0\udbff\udce0\udbff\udce0\udbff\udc57\udbff\udc57\udbff\udc57\udbff\udc57\udbff\udc71\udbff\udc71\udbff\udc71\udbff\udc71\udbff\udc54\udbff\udc54\udbff\udc54\udbff\udc54\udbff\udc53\udbff\udc53\udbff\udc53\udbff\udc53\udbff\udce0\udbff\udce0\udbff\udce0\udbff\udce0\udbff\udc76\udbff\udc76\udbff\udc76\udbff\udc76\udbff\udcdc\udbff\udcdc\udbff\udcdc\udbff\udcdc\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcde\udbff\udcde\udbff\udcde\udbff\udcde\udbff\udc69\udbff\udc69\udbff\udc69\udbff\udc69\udbff\udcdf\udbff\udcdf\udbff\udcdf\udbff\udcdf\udbff\udc69\udbff\udc69\udbff\udc69\udbff\udc69\udbff\udc77\udbff\udc77\udbff\udc77\udbff\udc77\udbff\udc57\udbff\udc57\udbff\udc57\udbff\udc57\udbff\udc71\udbff\udc71\udbff\udc71\udbff\udc71\udbff\udc54\udbff\udc54\udbff\udc54\udbff\udc54\udbff\udc68\udbff\udc68\udbff\udc68\udbff\udc68\udbff\udcdc\udbff\udcdc\udbff\udcdc\udbff\udcdc\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd\udbff\udcdd
# \u53d1\u8d27\u901a\u77e5
delivernotify_uri={api_base_url}/pay/delivernotify?access_token=%s
# \u7ef4\u6743\u5904\u7406
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/JsPayRequestV2.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/JsPayRequestV2.java
index 5217adda..73effa32 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/JsPayRequestV2.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/JsPayRequestV2.java
@@ -37,7 +37,7 @@ public class JsPayRequestV2 extends PayRequest {
public JsPayRequestV2(WeixinPayAccount weixinAccount,
PayPackageV2 payPackage) {
- this.setAppId(weixinAccount.getId());
+ super(weixinAccount.getId(), "");
this.setPackageInfo(package2string(payPackage,
weixinAccount.getPartnerKey()));
}
diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/NativePayResponseV2.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/NativePayResponseV2.java
index e943597b..f4b8152c 100644
--- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/NativePayResponseV2.java
+++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/payment/v2/NativePayResponseV2.java
@@ -7,14 +7,10 @@ import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
import com.alibaba.fastjson.annotation.JSONField;
import com.foxinmy.weixin4j.model.WeixinPayAccount;
-import com.foxinmy.weixin4j.util.DateUtil;
import com.foxinmy.weixin4j.util.DigestUtil;
-import com.foxinmy.weixin4j.util.RandomUtil;
-import com.foxinmy.weixin4j.xml.XmlStream;
/**
* V2 Native支付时的回调响应
@@ -43,58 +39,52 @@ public class NativePayResponseV2 extends JsPayRequestV2 {
@XmlElement(name = "RetErrMsg")
private String retMsg;
- @XmlTransient
- @JSONField(serialize = false)
- private WeixinPayAccount weixinAccount;
-
protected NativePayResponseV2() {
// jaxb required
}
+ /**
+ * 响应错误信息
+ *
+ * @param errorMsg
+ * 错误信息
+ */
+ public NativePayResponseV2(String errorMsg) {
+ this.retCode = "-1";
+ this.retMsg = errorMsg;
+ }
+
+ /**
+ * 正确响应
+ *
+ * @param weixinAccount
+ * @param payPackage
+ * 订单信息
+ */
public NativePayResponseV2(WeixinPayAccount weixinAccount,
PayPackageV2 payPackage) {
super(weixinAccount, payPackage);
this.retCode = "0";
this.retMsg = "OK";
- this.weixinAccount = weixinAccount;
+ Map map = new HashMap();
+ map.put("appid", weixinAccount.getId());
+ map.put("appkey", weixinAccount.getPaySignKey());
+ map.put("timestamp", getTimeStamp());
+ map.put("noncestr", getNonceStr());
+ map.put("package", getPackageInfo());
+ map.put("retcode", getRetCode());
+ map.put("reterrmsg", getRetMsg());
+ this.setPaySign(DigestUtil.paysignSha(map, null));
}
public String getRetCode() {
return retCode;
}
- public void setRetCode(String retCode) {
- this.retCode = retCode;
- }
-
public String getRetMsg() {
return retMsg;
}
- public void setRetMsg(String retMsg) {
- this.retMsg = retMsg;
- }
-
- /**
- * 生成 回调字符串
- *
- * @return native回调字符串
- */
- @XmlTransient
- @JSONField(serialize = false)
- public String asReqeustXml() {
- Map map = new HashMap();
- map.put("appid", weixinAccount.getId());
- map.put("appkey", weixinAccount.getPaySignKey());
- map.put("timestamp", DateUtil.timestamp2string());
- map.put("noncestr", RandomUtil.generateString(16));
- map.put("package", getPackageInfo());
- map.put("retcode", getRetCode());
- map.put("reterrmsg", getRetMsg());
- this.setPaySign(DigestUtil.paysignSha(map, null));
- return XmlStream.toXML(this);
- }
-
@Override
public String toString() {
return "NativePayResponseV2 [retCode=" + retCode + ", retMsg=" + retMsg