H5-支付宝支付

1,页面数据准备

		<form action="<%=basePath%>pay/submit" method="post" id="payForm">
		     <input id="WIDout_trade_no" name="WIDout_trade_no" type="hidden" value="${orderSubmitData.outTradeNo }"/>
		     <input id="WIDsubject" name="WIDsubject" type="hidden" value="手机网站支付"/>
		     <input id="WIDtotal_amount" name="WIDtotal_amount" type="hidden" value="${orderSubmitData.actualTotalPrice }"/>
		     <input id="WIDbody" name="WIDbody" type="hidden"/>
			 <input type="submit" value="支付"></input>
    	</form>

2,接收请求参数,调出支付宝支付页面

@RequestMapping("/submit")
	public void submit(HttpServletRequest request, HttpServletResponse response, String WIDout_trade_no, String WIDsubject, String WIDtotal_amount, String WIDbody, String pay_type){
		WrapperLog.start("[ALIPAY-"+WIDout_trade_no+"]", "PayController.submit start,WIDout_trade_no="+WIDout_trade_no+",WIDsubject="+WIDsubject+",WIDtotal_amount="+WIDtotal_amount+",WIDbody="+WIDbody+",pay_type="+pay_type);
		try {
			if(request.getParameter("WIDout_trade_no")!=null){
				// 商户订单号,商户网站订单系统中唯一订单号,必填
			    String out_trade_no = WIDout_trade_no;
				// 订单名称,必填
			    String subject = WIDsubject;
			    // 付款金额,必填
			    String total_amount=WIDtotal_amount;
			    // 商品描述,可空
			    String body = WIDbody;
			    // 超时时间 可空
			   String timeout_express="2m";
			    // 销售产品码 必填
			    String product_code="QUICK_WAP_WAY";
			    /**********************/
			    // SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签     
			    //调用RSA签名方式
			    AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.SIGNTYPE);
			    AlipayTradeWapPayRequest alipay_request=new AlipayTradeWapPayRequest();
			    
			    // 封装请求支付信息
			    AlipayTradeWapPayModel model=new AlipayTradeWapPayModel();
			    model.setOutTradeNo(out_trade_no);
			    model.setSubject(subject);
			    model.setTotalAmount(total_amount);
			    model.setBody(body);
			    model.setTimeoutExpress(timeout_express);
			    model.setProductCode(product_code);
			    alipay_request.setBizModel(model);
			    // 设置异步通知地址
			    
			    if ("pay".equals(pay_type)){
			    	alipay_request.setNotifyUrl(AlipayConfig.notify_url_check_sign);
			    }else if ("recharge".equals(pay_type)){
			    	alipay_request.setNotifyUrl(AlipayConfig.recharge_notify_url_check_sign);
			    }
			    // 设置同步地址
			    alipay_request.setReturnUrl(AlipayConfig.return_url);   
			    
			    // form表单生产
			    String form = "";
				try {
					// 调用SDK生成表单
					form = client.pageExecute(alipay_request).getBody();
					response.setContentType("text/html;charset=" + AlipayConfig.CHARSET); 
				    response.getWriter().write(form);//直接将完整的表单html输出到页面 
				    response.getWriter().flush(); 
				    response.getWriter().close();
				} catch (AlipayApiException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} 
			}
		} catch (Exception e) {
			WrapperLog.error("PayController.submit occured exception:", e);
		}
		WrapperLog.end("PayController.submit end");
	}

3,配置信息

public class AlipayConfig {
	// 商户appid
	public static String APPID = ApplicationContextConfig.get("alipay.appid");
	// 私钥 pkcs8格式的
	public static String RSA_PRIVATE_KEY = ApplicationContextConfig.get("alipay.rsaPrivateKey");
	// 服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
	public static String notify_url = ApplicationContextConfig.get("alipay.notifyUrl");
	public static String recharge_notify_url = ApplicationContextConfig.get("alipay.recharge.notifyUrl");
	
	public static String notify_url_check_sign = ApplicationContextConfig.get("alipay.notifyUrl.checkSign");
	public static String recharge_notify_url_check_sign = ApplicationContextConfig.get("alipay.recharge.notifyUrl.checkSign");
	// 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址
	public static String return_url = ApplicationContextConfig.get("alipay.returnUrl");
	// 请求网关地址
	public static String URL = ApplicationContextConfig.get("alipay.url");
	// 编码
	public static String CHARSET = ApplicationContextConfig.get("alipay.charset");
	// 返回格式
	public static String FORMAT = ApplicationContextConfig.get("alipay.format");
	// 支付宝公钥
	public static String ALIPAY_PUBLIC_KEY = ApplicationContextConfig.get("alipay.publicKey");
	// 日志记录目录
	public static String log_path = ApplicationContextConfig.get("alipay.logPath");
	// RSA2
	public static String SIGNTYPE = ApplicationContextConfig.get("alipay.signType");
}

4,支付成功回调验签

@RequestMapping("/alipayNotifyPay")
	public void alipayNotifyPay(HttpServletRequest req){
		try {
			String out_trade_no = new String(req.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
			WrapperLog.start("[ALIPAYNOTIFY-PAY-"+out_trade_no+"]", "PayController.alipayNotifyPay start");
			Map<String,String> params = new HashMap<String,String>();
			Map<String, String[]> requestParams = req.getParameterMap();
			StringBuilder notifyUrl = new StringBuilder(ApplicationContextConfig.get("alipay.notifyUrl"));
			
			for (Object key : requestParams.keySet()) {
				String name = String.valueOf(key);
				String[] values = (String[]) requestParams.get(name);
				String valueStr = "";
				for (int i = 0; i < values.length; i++) {
					valueStr = (i == values.length - 1) ? valueStr + values[i]
							: valueStr + values[i] + ",";
				}
				//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
				//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
				params.put(name, valueStr);
			}
			
			WrapperLog.info("params="+JSONObject.toJSONString(params));
			WrapperLog.info("start check sign");
			boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.SIGNTYPE);
			WrapperLog.info("check result:"+verify_result);
			
			if (verify_result){
				WrapperLog.info("check sign success,start notify nodejs,url is:"+notifyUrl.toString());
				String notifyRes = CommonUtils.post(notifyUrl.toString(), params);
				WrapperLog.info("notify end,result is:"+notifyRes);
			}
		} catch (Exception e) {
			WrapperLog.error("PayController.alipayNotifyPay occured exception:", e);
		}
		
		WrapperLog.end("PayController.alipayNotifyPay end");
	}

5,效果

发布了7 篇原创文章 · 获赞 0 · 访问量 512

猜你喜欢

转载自blog.csdn.net/ly1944cool/article/details/89146499