微信支付之web篇

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


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

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中。





评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值