微信支付之web篇

来源:互联网 发布:手机视力测试软件 编辑:程序博客网 时间:2024/06/05 16:07

此篇默认你已经申请了微信账号,并且已经开通了支付,拿到了商户平台账号。


在开发之前你需要准备好以下东西:

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证书密码,默认密码等于商户号MCHIDprivate static String certPassword = "";// 是否使用异步线程的方式来上报API测速,默认为异步模式private static boolean useThreadToDoReport = true;// 机器IPprivate 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 blocke.printStackTrace();returnMsg = null;} catch (KeyManagementException e) {// TODO Auto-generated catch blocke.printStackTrace();returnMsg = null;} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();returnMsg = null;} catch (KeyStoreException e) {// TODO Auto-generated catch blocke.printStackTrace();returnMsg = null;} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.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中。





0 0
原创粉丝点击