此篇文章写的是微信网站支付宝支付,这篇文章写接入的完整过程和原码,如果需要支付宝完成支付后的异步通知相关的代码,请看下一篇博客。 支付宝API网站:https://docs.open.alipay.com/203/105285/因为微信限制的原因,所以支付宝不能在微信的页面完成支付 ,所以我们要先将其转发到手机自带浏览器中,然后调用支付宝的接口,如果手机中下载了支付宝客户端,就会提示打开客户端,如果没有客户端就跳到支付宝浏览器登录页面,我实现的原理是用户点击了付款直接提示页。 这个页面时微信提供的页面,我们做了修改,此页面在安卓和苹果显示不同的样式,所以不用修改,此页面原码:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
//获取orderid
String orderid = (String)request.getParameter("orderid");
if(orderid!=null){
request.setAttribute("orderid", orderid);
}
%>
支付提示
用户点击了,转发到手机浏览器,浏览器会首先打开上面的页面,然后判断是否是微信浏览器,不是就会调用上面页面的ajax,到下一个jsp或者action,我这里转了一个action,但是action中没有实际内容,只是吧商品的信息带过来了。所以,直接转jsp也是可以的。下面jsp中appid和公钥私钥,都做了隐藏,下面是jsp代码:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page language="java" import="com.alipay.api.*" %>
<%@ page language="java" import="com.alipay.api.request.*" %>
<%@ page language="java" import="julit.zhifubao.bean.*" %>
<%
String path = request.getContextPath();if(path.endsWith("/")){path="";}
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
String appid = "2017********51";
String method = "alipay.trade.app.pay";//接口名称
String version = "1.0";//调用的接口版本,固定为:1.0
String private_app_key = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDe/LHRjB6LUWcYG6R5d9Cv6NIhPQAH3MhltAIKMdV+r0bQdu2FUrCRZtpx7MMEVFZXNON6y2WDnteLQ5iic/Im3nGqr8GTXtfdWrtksbgUv5qw8iIktYysWaOWxSI9mGS4W/OqeDo3WcaC7Cg5CkDTpuGUWYjpjF978l9V3fdiGF8Ce0kPF/2C9hknp1TQPdvaHo9b56Apevug++Obrp0onzJUdgDl8bmEbUyqzvqNoGP+4HIvNrIMf7GkKfnDDKYxHUppeSFcXYUSfkF9eX5JM4TnelMeQlnEhTrY/K9Hz5E1cdFeIqPPKXev3pbnUgeHGI2j4z7GJmg4k1O1eV61AgMBAAECggEBAMlR+bUHvZfo0Zw5cMBeBWKcYAK0US/IDIG**********************************/vECgYBotglZiRwdIDHx0QB+WFmIckfKx/NZe3Xz668ZTqyJC2FYZLvjdQZofg5OjTjhxSyMieogyrkgE73g0qKNwVjmuWgSEop7a23HhVh+lWV/Q3MEl859r53S0ZMM51+OlbZJOGTA3vkAq4cFTbrcVCIEWebUvpGqI+NbahkVHQHYXQKBgQDPqSXNNTY0UDKuPU9WhWBXvNhVrywYY/x9WcyjiEWwhGkWOVZbWfxSkM7D2bNdLdLzOuGDtktF3BqbU77lDMq6UfyRAqd/gD9kb00igPG1X+O2s4OqyrJMgV9w6PY3DbxWrqdAmbzdIbDAgQnxRAtUa+wivpvUvi7WuAGKOfgFRA==";
String alipay_public_app_key
= "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3vyx0Ywei1FnGBukeXfQr+jSIT0AB9zIZbQCCjHVfq9G0HbthVKwkWbacezDBFRWVzTjestlg57Xi0OYonPyJt5xqq*****************uByLzayDH+xpCn5wwymMR1KaXkhXF2FEn5BfXl+STOE53pTHkJZxIU62PyvR8+RNXHRXiKjzyl3r96W51IHhxiNo+M+xiZoOJNTtXletQIDAQAB";
String input_charset = "utf-8";// 字符编码格式 目前支持 gbk 或 utf-8
//
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", appid, private_app_key, "json", input_charset, alipay_public_app_key, "RSA2"); //获得初始化的AlipayClient
String orderno = (String)request.getAttribute("orderno");//订单号
String price = (String)request.getAttribute("price");//订单价格
String subject = (String)request.getAttribute("title");//商品名
String product_code = "QUICK_WAP_PAY";//销售产品码,商家和支付宝签约的产品码,固定值,不需改变。
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", appid, private_app_key, "json", input_charset, alipay_public_app_key, "RSA2"); //获得初始化的AlipayClient
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//创建API对应的request
alipayRequest.setReturnUrl(basePath+"/pay_success.jsp");
alipayRequest.setNotifyUrl(basePath+"wapZhifubao***Back.action");//在公共参数中设置回跳和通知地址
alipayRequest.setBizContent("{" +
"
\"out_trade_no\":\""+orderno+"\"," +
"
\"total_amount\":"+price+"," +
"
\"subject\":\""+subject+"\"," +
"
\"product_code\":\"QUICK_WAP_WAY\"" +
"
}");//填充业务参数
String form="";
try {
form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
} catch (AlipayApiException e) {
e.printStackTrace();
}
out.write(form);
%>这个jsp执行完成后就会,就会输出一个form表单,包括form表单提交的相关js代码,浏览器会自动执行提交,注意此jsp中ReturnUrl是本地成功后转发的jsp,用户可以看到的,可以提示用户已经支付成功。NotifyUrl是用户支付成功后,支付宝会向你的服务器发请求,会把用户支付的参数通知给你,也就是支付宝的异步通知,如果需要这部分代码,请看下一篇文章。 这个jsp出现的页面是这样的。 然后便是支付宝客户端,打开付款。 支付宝异步通知原码,请看下一篇博客。