该文仅对于中间这种支付方式有参考价值哟
如果你的产品经理很倔,刚好又9要求在微信公众号号中就是要调用支付宝支付,怎么gai,希望以下工作笔记对你有用,
一、准备工作
在支付宝开放平台创建一个应用(https://openhome.alipay.com/platform/appCreate.htm)
创建成功后,从应用列表进入应用详情,为该应用添加手机网站支付功能,既申请该接口
在申请过程中需要提供你系统的url, 支付宝的要求是系统需商品信息完整且达到接入该接口的标准,这要求迷惑我好久,所以我的申请被打回n次,如果你也遇到这种情况,不要急,支付宝在线客服(https://cschannel.alipay.com/newPortal.htm?scene=mysjpt)可以帮到你
配置回调url和通知url:
二,开发步骤
这里的步骤是通过浏览器调用接口时的步骤,后面补充通过微信端调用时的情况
step1. 按照惯例,先找接口文档,会手把手教你接入该接口,接入成功后找到集成文档. 阿里做的都是良心接口,提供了demo给大家参考,新版的调用方式更是直接把工具类封装成sdk , 集成好sdk后再也不用担心怎么样去发送http请求等。
老版demo , 新版demo,目前新版demo只有php方式和RSA签名方式;
step2. 传递参数,以下代码在demo中都有现在的,只是需要理解每个参数的意义
这里调用成功后生成如下页面,如果将app_pay参数设置为Y,会弹出是否打开支付宝app的请求窗口。
当跳转到这个页面,你就大可放心了,支付宝已经接手,
step3.处理返回结果
密码输入成功后,交易也成功,这里又轮到我们上场了。交易完成有两个事情要做:
1.根据交易状态异步处理订单状态,即我们在准备工作中所配置的异步回调url:ALI_NOTIFY_URL = http://XXX/order/modify_order_status_alipay.html,这个方法中做了两件事,首先将解析支付宝返回的参数,再根据处理状态对订单进行处理即对系统数据库进行操作
/**
* 支付宝支付成功回调
*@return
*/
@RequestMapping("modify_order_status_alipay.html")
public voidmodifyOrderStatusAlipay(HttpServletRequest request,HttpServletResponse response)throwsIOException {
System.out.println("i am in modify_order_status_alipay");
Map> orderMap = com.hj.custsys.wechat.common.SystemCache.getInstance().getOrderList();
System.out.println("orderMap=="+ orderMap);
ModelAndView modelAndView =newModelAndView();
//获取支付宝POST过来反馈信息
Map params =newHashMap();
Map requestParams = request.getParameterMap();
for(Iterator iter = requestParams.keySet().iterator();iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr ="";
for(inti =0;i < values.length;i++) {
valueStr = (i == values.length-1) ? valueStr + values[i]
: valueStr + values[i] +",";
}
valueStr =newString(valueStr.getBytes("ISO-8859-1"),"gbk");
params.put(name,valueStr);
}
//获取支付宝的通知返回参数
//公司Id
String companyIdStr =newString(request.getParameter("body").getBytes("ISO-8859-1"),"UTF-8");
Integer companyId = Integer.parseInt(companyIdStr);
//商户订单号
String orderId =newString(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
//支付宝交易号
String trade_no =newString(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");
//交易状态
String trade_status =newString(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");
System.out.println("out_trade_no::"+ orderId);
System.out.println("trade_status::"+ trade_status);
String sHtmlText ="";
// if(AlipayNotify.verify(params)){//验证成功
if(trade_status.equals("TRADE_FINISHED")) {
}else if(trade_status.equals("TRADE_SUCCESS")) {
//处理你的订单状态
}
System.out.println("状态修改成功 end");
}
System.out.println("success");
response.getWriter().println("success");
sHtmlText ="success";
/*}else{//验证失败
System.out.println("fail");
response.getWriter().println("fail");
sHtmlText= "fail";
}*/
}
2.是否进行页面跳转,如以下图片是我配置的RETURN_URL =http://XXX/order_result.html处理后的结果
三、微信端调用
前两步不用看或者只研究支付宝官方文档就可以成功将钱送给支付宝。
为什么微信端调用支付宝会单独写一节了,前面就提到过,因为微信把支付宝屏蔽了,屏蔽了。上有政策,下有对策,难不到互联网界的精兵奇才们。需要做的就是先判断客户端是否为微信,如果是微信提示用浏览器打开,大家应该对下图面熟吧,
干货在这里,
<%@pagelanguage="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@taglibprefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
支付宝支付
正在进行支付宝支付...
请点击右上角"在浏览器中打开"
在浏览器中完成支付
请在菜单中选择"浏览器中打开"
在浏览器中完成支付
是否已完成付款?
请确保支付完成后,点击
href="${pageContext.request.contextPath}/order/payment_verify.html?companyId=${companyId}&orderId=${orderId}">完成付款
varcontextPath ="${pageContext.request.contextPath}";
varua =navigator.userAgent.toLowerCase();
if(ua.match(/MicroMessenger/i) =="micromessenger") {
$(".container").css("display","block");
if(ua.indexOf('iphone') != -1|| ua.indexOf('ipad') != -1|| ua.indexOf('ipod') != -1) {
$(".weixin-tip-img-iphone").css("display","block");
$(".weixin-tip-img-android").css("display","none");
}else{
$(".weixin-tip-img-iphone").css("display","none");
$(".weixin-tip-img-android").css("display","block");
}
}else{
self.location.href= contextPath +"/order/ali_payment.html?companyId=${companyId}&orderId=${orderId}";}
原理就是一直判断客户端是否为支付宝支持的客户端, 直到满足条件为止,满足条件后操作流程就回到了上一步 。