該文僅對于中間這種支付方式有參考價值喲
如果你的產品經理很倔,剛好又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}";}
原理就是一直判斷客戶端是否為支付寶支持的客戶端, 直到滿足條件為止,滿足條件后操作流程就回到了上一步 。?