微信支付之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中。
- 微信支付之web篇
- 微信支付之Android篇
- 微信开发大坑汇总之微信支付篇
- 微信支付之公众号支付
- 4.微信支付之刷卡支付
- 6.微信支付之JSAPI支付
- C# 微信支付之JSAPI支付
- 微信支付之公众号支付
- 第三方支付之微信支付
- 第三方支付之微信支付
- 移动支付之微信支付
- iOS开发支付之微信支付
- 微信支付之公众号支付
- Android支付之微信支付
- 微信支付之公众号支付
- 微信支付之H5支付
- iOS 之 微信支付
- iOS之微信支付
- Cockroach Design 翻译 ( 十一) range元数据
- 三序遍历以及Vertical Order
- Cockroach Design 翻译 ( 十二) Raft – Range副本一致性
- writeup-web
- JavaSE学习(4)流程控制
- 微信支付之web篇
- Codeforces Round #382 (Div. 1) A. Tennis Championship(递推)
- SAP HANA Studio使用insufficient privilege 问题
- 关于异常处理的部分总结
- 03-树1 树的同构 (25分)
- SAP HANA Studio出现"Fetching Children..."问题
- java拦截器,过滤器,监听器的区别和执行顺序
- RSA数字签名算法
- Linux下防止程序挂掉的shell脚本