此篇默认你已经申请了微信账号,并且已经开通了支付,拿到了商户平台账号。
在开发之前你需要准备好以下东西:
1.一个微信支付的demo,可以在这里下载:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1
2.微信支付商户号
3.应用APPID
4.key/apikey(通过以下步骤,你可以拿到你的key:登录商户平台》账户中心》api安全》设置密钥),此key是一个32位字符串,你可以md5生成或者使用uuid(去-后的)
5.设置完成密钥后,你就可以在api安全中,下载安全证书。
6.各种包(xmlpull-1.1.3.1.jar,xpp3-1.1.4c.jar,wxpay-scanpay-java-sdk-1.0.jar,
以及一个zxing的二维码生成包,这个包不是必须的,你可以用js生成二维码来代替)
在此处我们用jquery.qrcode.min.js来生成二维码,这样的好处是可以不保存文件直接在页面显示二维码
在微信支付中,java的demo是没有扫描支付的这就需要我们根据demo自己开发,在此需要事先去了解一下微信的统一支付接口。
以下是这次的大致目录结构,以及用到的文件,因为还没有完全摘出来可能有一些文件用不到,但不影响
1.在作为准备工作后,我们需要把以上提到的包导入项目中
2.开始进行编码,以下是基本的目录结构(注意:在页面中我们需要一个返回空页面,来返回异步回调的值,否则异步回调会被调用多次)
下面让我们配置微信支付需要用到的信息,这个在WXConfig中可以看到:
private static String key = "";//商户平台中添的32位码
// 微信分配的公众号ID(开通公众号之后可以获取到)
private static String appID = "";
// 微信支付分配的商户号ID(开通公众号的微信支付功能之后可以获取到)
private static String mchID = "";
// 回调地址
private static String notify_url = "";
// 受理模式下给子商户分配的子商户号
private static String subMchID = "";
// HTTPS证书的本地路径
private static String certLocalPath = "你的apiclient_cert.p12存放路径";
// HTTPS证书密码,默认密码等于商户号MCHID
private static String certPassword = "";
// 是否使用异步线程的方式来上报API测速,默认为异步模式
private static boolean useThreadToDoReport = true;
// 机器IP
private static String ip = "";
// 以下是几个API的路径:
public static String uniform_order = "https://api.mch.weixin.qq.com/pay/unifiedorder";
支付的主要入口方法,这个方法不在以上文件中,这个方法主要是在选择支付后调用,用于请求支付接口,并在生产二维码后做页面显示:
/**
* 微信支付方法
* @param orderNum
* @param orderMsg
* @param allPrice
*/
private void WXPay(String orderNum,String orderMsg,String allPrice){
// 元转换为分
BigDecimal fPrice = new BigDecimal(Float.parseFloat(allPrice) * 100);
String allPriceF = fPrice.setScale(0, BigDecimal.ROUND_HALF_UP)
.toString();
WXPay wxPay = new WXPay();
ReqData payData = wxPay.pay(orderNum,
orderNum, allPriceF, orderMsg,
GetIP.getIpAddr(getRequest()));
String returnMsg = "";
try {
if (payData != null) {
HttpsRequest hr = new HttpsRequest();
returnMsg = hr.sendPost(WXConfig.uniform_order, payData);
}
} catch (UnrecoverableKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
returnMsg = null;
} catch (KeyManagementException e) {
// TODO Auto-generated catch block
e.printStackTrace();
returnMsg = null;
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
returnMsg = null;
} catch (KeyStoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
returnMsg = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
returnMsg = null;
}
if (returnMsg != null && !"".equals(returnMsg)) {
ResData res = (ResData) Util.getObjectFromXML(returnMsg,
ResData.class);
if ("SUCCESS".equals(res.getResult_code())) {
setAttr("order_name", orderMsg);
// 以元的形式显示,例:0.01;
setAttr("order_price",allPrice);
setAttr("code_url", res.getCode_url());
setAttr("error_message","");
} else {
setAttr("error_message", res.getErr_code_des());
}
}
}
WXpay中的方法:
public ReqData pay(String orderId, String productId, String totalCount,
String body, String ip) {
ReqData req = new ReqData();
req.setAppid(WXConfig.getAppid());
req.setMch_id(WXConfig.getMchid());
req.setNonce_str(RandomStringGenerator.getRandomStringByLength(32));
req.setOut_trade_no(orderId);
req.setTotal_fee(totalCount);
req.setSpbill_create_ip(ip);
req.setNotify_url(WXConfig.getNotify_url());
req.setTrade_type("NATIVE");
req.setProduct_id(productId);
req.setBody(body);
try {
req.setSign(Signature.getSign(req));
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
req = null;
}
if (req == null) {
return null;
}
return req;
}
以下是前台页面需要用到的代码:
<div id="qr_code"></div>
<script >
jQuery('#qr_code').qrcode({
text : "${code_url}",
width : 200,
height : 200
});
</script>
其他文件都是微信demo中的文件,大家可以自己找,在把支付宝和微信封装后我也将上传到github中。