在接入支付宝支付前,你需要先和支付宝签约,web端要签约即时支付,app端支付要签约app支付。当然要是需要别的也可以根据需要签约
支付宝支付相对微信支付接入要简单一些,签约成功后,你就可以在你的开发者账户中看到一个已上线的签约项目,里面会标明你可以使用那些功能,你也可以自己添加新的功能。
在接入web支付前,我们需要准备:
1.partner (pid在你的签约页面可以看到,你也可以通过qy.alipay.com登录,然后在我的商家服务》签约管理中找到)
2.seller_email (商家邮箱,一般就是你的登录邮箱)
3.key (和pid在一起,需要验证后才能看到)
4.在开发者平台中的账号信息,你可以找到合作伙伴密钥。(如果你有app支付需要在这里上传rsa公钥,来得到支付宝公钥。web支付是md5验签所以可以不用)
5.支付宝的即时支付demo(https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.LW4YWX&treeId=193&articleId=103419&docType=1在这里你可以找到你要的文档和demo,你需要下即时支付的demo)
在拿到以上这些信息后你就可以开始web编码:
以下是我们本次所需要用到的文件:
其中标红的是我们自己的或者需要修改的文件,其他的文件我们只需把demo中的文件拿出来就可以直接用。
下面让我们看具体实现,首先我们需要配置一下AlipayConfig,支付宝的提示很清晰,基本按提示填入我们上边说的准备好的东西即可。
在个是支付宝支付的入口方法,不在以上文件中:
private void aliPay(String orderNum,String orderMsg,String allPrice){
OrderBaseMsg obm = new OrderBaseMsg();
obm.out_trade_no = orderNum;
obm.subject = orderMsg;
obm.total_fee = allPrice;
obm.body = "";
obm.show_url = "";
try {
obm.anti_phishing_key = AlipaySubmit.query_timestamp();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
obm.exter_invoke_ip = GetIP.getIpAddr(getRequest());
Map<String, String> map = obm.orderMsg();
String pay = AlipaySubmit.buildRequest(map, "get", "支付");
setAttr("pay", pay);
}
其中OrderBaseMsg是一个bean文件,主要用来接收和发送一些参数:
public class OrderBaseMsg {
//订单信息
//支付类型
public String payment_type = "1";
//必填,不能修改
//服务器异步通知页面路径
public String notify_url = "";
//需http://格式的完整路径,不能加?id=123这类自定义参数
//页面跳转同步通知页面路径
public String return_url = "";
//public String return_url = "http://127.0.0.1/order/returnUrl";
//需http://格式的完整路径,不能加?id=123这类自定义参数,不能写成http://localhost/
//商户订单号
public String out_trade_no = "";
//商户网站订单系统中唯一订单号,必填
//订单名称
public String subject = "";
//必填
//付款金额
public String total_fee = "";
//必填
//订单描述
public String body = "";
//商品展示地址
public String show_url = "";
//需以http://开头的完整路径,例如:http://www.商户网址.com/myorder.html
//防钓鱼时间戳
public String anti_phishing_key = "";
//若要使用请调用类文件submit中的query_timestamp函数
//客户端的IP地址
public String exter_invoke_ip = "";
//非局域网的外网IP地址,如:221.0.0.1
public Map<String,String> orderMsg(){
//把请求参数打包成数组
Map<String, String> sParaTemp = new HashMap<String, String>();
sParaTemp.put("service", "create_direct_pay_by_user");
sParaTemp.put("partner", AlipayConfig.partner);
sParaTemp.put("seller_email", AlipayConfig.seller_email);
sParaTemp.put("_input_charset", AlipayConfig.input_charset);
sParaTemp.put("payment_type", payment_type);
sParaTemp.put("notify_url", notify_url);
sParaTemp.put("return_url", return_url);
sParaTemp.put("out_trade_no", out_trade_no);
sParaTemp.put("subject", subject);
sParaTemp.put("total_fee", total_fee);
//sParaTemp.put("body", body);
//sParaTemp.put("show_url", show_url);
sParaTemp.put("anti_phishing_key", anti_phishing_key);
sParaTemp.put("exter_invoke_ip", exter_invoke_ip);
return sParaTemp;
}
}
在AlipayCtrl中主要处理了异步回调,这个可文档你就可以知道有那些值返回给你,你只需要根据自己的框架特性接收就好。然后修改你的订单。
在AlipayNotify中,主要是对数据的验证,这个是你调试支付的关键文件,因为他会通过log输出一些关键信息供你调试,你需要根据自己习惯更改log格式。