一开始是想使用完全UI5,实现支付宝的支付,后这应该是不可行的,UI5,这只是端的代码实现,后面找到了支付宝提供的SDK,有JAVA的SDK,做了一下,既然在支付定的沙箱中测试成功了,
一、当然是要开通支付宝的收款功能了,如是通过网页(UI5)那要使用的就是支付宝的“网页手机支付”功能,先到蚂蚁金服开放平台开通,并创建一个运行,具体的申请开能操作网上很多,可以在百度找到。
二、创建运用后,会得到你很多信息,比如APPID,商户的私钥,支付宝的公钥等信息,获取方法问百度。
三、从文档中心,找到资源下载,找到服务器SDK,下载得到支付宝SDK文件,把下载下来的SDK文件放到你的UI5主目录下的WEB-INF/lib/,主要是alipay-sdk-java20161129201425.jar文件(版本不同,文件名应该不同),同时可能还需要把javax.servlet.jar也放到此目录下,生成的程序目录如下。
四、做一个severlet.java,用于调用支付宝的SDK,在此例子附件中的为com.alipay.alipay.java。
[mw_shl_code=java,true]package com.alipay;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.alipay.util.AlipaySubmit ;
import com.alipay.api.AlipayApiException;
import java.util.HashMap ;
import java.util.Map ;
/**
* Servlet implementation class alipay
*/
public class alipay extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public alipay() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at返回: ").append(request.getContextPath());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setCharacterEncoding("utf-8");
response.setContentType("text/html");
//doGet(request, response);
//PrintWriter out = response.getWriter();
//out.println("TEST测试");
//out.close();
//商户订单号,商户网站订单系统中唯一订单号,必填
String out_trade_no = request.getParameter("WIDout_trade_no");
//订单名称,必填
String subject = request.getParameter("WIDsubject");
//付款金额,必填
String total_amount = request.getParameter("WIDtotal_fee");
//商品描述,可空
String maktx = request.getParameter("WIDbody");
String return_froms = null;
//把请求参数打包成数组
Map<String, String> sParaTemp = new HashMap<String, String>();
sParaTemp.put("out_trade_no", out_trade_no);
sParaTemp.put("subject", subject);
sParaTemp.put("total_amount", total_amount);
sParaTemp.put("body", maktx);
//立即支付
try {
return_froms = AlipaySubmit.buildRequest(sParaTemp);
} catch (AlipayApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
response.getWriter().write(return_froms);
}
}
[/mw_shl_code]
五、创建一个JAVA文件用于存放支付商户的配置信息com.alipay.config.AlipayConfig.java。
[mw_shl_code=applescript,true]package com.alipay.config;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
/* *
*类名:AlipayConfig
*功能:基础配置类
*详细:设置帐户有关信息及返回路径
*版本:3.4
*修改日期:2016-03-08
*说明:
*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/
public class AlipayConfig {
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 合作身份者ID,签约账号,以2088开头由16位纯数字组成的字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
public static String partner = "2088****";
// 收款支付宝账号,以2088开头由16位纯数字组成的字符串,一般情况下收款账号就是签约账号
public static String seller_id = partner;
//商户的私钥,需要PKCS8格式,RSA公私钥生成:https://doc.open.alipay.com/doc2 … Id=103242&docType=1
public static String private_key = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAN7iDqD5VXvSiWw8FmLe62IBF24lBfYO8IYo9CWv5tOLHSa/NxZ0b/qpK3XgKFYGGr82ixD62cctrUjp10JvBq2kyVre/P4kBztjBKxAIe4tqdMzAupokdZsrkz6Xo2liACWcH6lWW1Q5t5LI0xRxFkbeYj85LqF/GmeaZ8fjTy7AgMBAAECgYASFtjHGdVlSk4a+bl7ZspF1v7W0qxsLwQ4b0R5dpBOZQEFrwlCikq4Vli****1jvZ+xO9ESQU8zu1s/bZ7wFAgWT3nZVRJJDXT9C9LXe+k9j6tE0LQ2gg8BFcOMMp1v+Q/6lE+BJf5+g0UMzQJzmQJBAP1kZmQqDjtiQgU6O3e3Wu8pcuqd3oZG3X43aEhCkgH0oOsuFl1WusLOu5eXc47C2n1tYEVKUvua2fMSoO3DnxcCQQDhLUa1VacqwIzbHt6rItQsD1oYWpyQihy0OddTJ87XqjZg3A+g2x/89asDy6sH8dMDHxdUHaGPgACwOM/8yPX9AkBM/*****WJDSsZRPoWWpa88ZukOu042UPS5kPwLMZ37ZbRQBrLeG3mV+/kJqchcRzAkEAkzzMwGOqdC0FrX3o8ZRLkifTrJsLRwPYMwyjPI+KE8EL35flbDP8Habx1QCG7CH27VKWKX1al/+F87SiY1NwbQJBAPGqIvceqiCAJeO8L/KhbYhnuoAiJsUUqsCdS2/HzJi5hox3OCxY+IbSYztEEWAocFoApBs+aH+DKi9HeesCHG0=";
// 支付宝的公钥,查看地址:https://b.alipay.com/order/pidAndKey.htm
public static String alipay_public_key = "MIGfMA0GCSqGSIb3******FY99uhpiq0qadD/uSzQsefWo0aTvP/65zi3eof7TcZ32oWpwIDAQAB";
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://wwww.ut163.com/ui5_test/ZFB/notify_url.jsp";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String return_url = "http://wwww.ut163.com/ui5_test/ZFB/return_url.jsp";
//网关
//沙箱:https://openapi.alipaydev.com/gateway.do
//正式:https://mapi.alipay.com/gateway.do
public static String alipay_gateway = "https://openapi.alipaydev.com/gateway.do";
//APPID
//沙箱:2016072900118438
public static String app_id = "2016072900118438";
// 签名方式
public static String sign_type = "RSA";
// 调试用,创建TXT日志文件夹路径,见AlipayCore.java类中的logResult(String sWord)打印方法。
public static String log_path = "C:\\";
// 字符编码格式 目前支持 gbk 或 utf-8
public static String input_charset = "utf-8";
// 支付类型 ,无需修改
public static String payment_type = "1";
// 调用的接口名,无需修改
public static String service = "create_direct_pay_by_user";
//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
//↓↓↓↓↓↓↓↓↓↓ 请在这里配置防钓鱼信息,如果没开通防钓鱼功能,为空即可 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
// 防钓鱼时间戳 若要使用请调用类文件submit中的query_timestamp函数
public static String anti_phishing_key = "";
// 客户端的IP地址 非局域网的外网IP地址,如:221.0.0.1
public static String exter_invoke_ip = "";
public static AlipayClient alipayClient;
//↑↑↑↑↑↑↑↑↑↑请在这里配置防钓鱼信息,如果没开通防钓鱼功能,为空即可 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
public static AlipayClient get_alipayClient(){
if(alipayClient == null ){
alipayClient = new DefaultAlipayClient( AlipayConfig.alipay_gateway,
AlipayConfig.app_id,AlipayConfig.private_key,"json",
AlipayConfig.input_charset,AlipayConfig.alipay_public_key);
};
return alipayClient;
};
}
[/mw_shl_code]
六、在com.alpay.util下面是一些常用的支付相关的功能,不过,现在使用的只有AlipaySubmit.jaja,其它的功能还没测试,此主要是提交付款订单到支付宝,并付款使用。
七、最后就是在UI5的一个JS中调用前面servlet来完成付款了
[mw_shl_code=java,true]sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/m/MessageToast",
], function (Controller, MessageToast) {
"use strict";
return Controller.extend("sap.alipay.wt.controller.BuyRegisterSAP", {
/**
* Called when a controller is instantiated and its View controls (if available) are already created.
* Can be used to modify the View before it is displayed, to bind event handlers and do other one-time initialization.
* @memberOf alipay.alipay
*/
// onInit: function() {
//
// },
onAlipayTest : function () {
var con = this;
var form = "";
$.ajax({
url:"AlipaySubmit",
data:{"WIDout_trade_no":"ztest20161216213249",
"WIDsubject":"test商品123",
"WIDtotal_fee":1000,
"WIDbody":"即时到账测试"},
dataType: ‘html’,
type: ‘POST’,
async:false,
success:function(data){
form = data;
//MessageToast.show(form)
//con.alipayOpen(form)
},
error:function (data,status){
var html = data;
MessageToast.show("servlet失败")
}
});
if (form != ”){
con.alipayOpen1(form)
//con.alipayOpen2(form)
};
},
alipayOpen1 : function (l_html){
/*方法一,直接用HTML*/
var w = window.open(”,’_self’);
$(w.document.write(l_html));
//MessageToast.show(l_html)
},
alipayOpen2 : function (form){
/*方法二,解析HTML,并post*/
var paramters = new Array();
var l_begin = form.indexOf(‘action="’) + 8;
var l_end = form.indexOf(‘"’,l_begin );
var url = form.substring(l_begin,l_end);
l_begin = form.indexOf(‘biz_content" value="’) + ‘biz_content" value="’.length;
l_end = form.indexOf(‘"’,l_begin );
var l_biz_content = form.substring(l_begin,l_end);
//l_biz_content = this.htmlDecode(l_biz_content);
paramters.push({name:"biz_content",value:l_biz_content});
MessageToast.show(l_biz_content)
l_begin = form.indexOf(‘submit" value="’) + ‘submit" value="’.length;
l_end = form.indexOf(‘"’,l_begin );
var l_submit = form.substring(l_begin,l_end);
//paramters.push({name:"submit",value:l_submit});
//MessageToast.show(url)
var con = this;
con.post(url,paramters);
},
/*
*功能: 模拟form介绍的提交
*参数: URL 跳转地址 PARAMTERS 参数
*返回值:
*创建时间:20160713
*创建人:
*/
post : function (URL, PARAMTERS) {
//创建form介绍
var temp_form = document.createElement("form");
temp_form.action = URL;
//如需打开新窗口,form的target属性要设置为’_blank’
temp_form.target = "_self";
temp_form.method = "post";
temp_form.style.display = "none";
//添加参数
for (var item in PARAMTERS) {
var opt = document.createElement("textarea");
opt.name = PARAMTERS[item].name;
opt.value = PARAMTERS[item].value;
temp_form.appendChild(opt);
}
document.body.appendChild(temp_form);
//提交数据
temp_form.submit();
},
htmlEncode:function (html){
//1.首先动态创建一个容器标签元素,如DIV
var temp = document.createElement ("div");
//2.然后将要转换的字符串设置为这个元素的innerText(ie支持)或者textContent(火狐,google支持)
(temp.textContent != undefined ) ? (temp.textContent = html) : (temp.innerText = html);
//3.最后返回这个元素的innerHTML,即得到经过HTML编码转换的字符串了
var output = temp.innerHTML;
temp = null;
return output;
},
/*2.用浏览器内部转换器实现html解码*/
htmlDecode:function (text){
//1.首先动态创建一个容器标签元素,如DIV
var temp = document.createElement("div");
//2.然后将要转换的字符串设置为这个元素的innerHTML(ie,火狐,google都支持)
temp.innerHTML = text;
//3.最后返回这个元素的innerText(ie支持)或者textContent(火狐,google支持),即得到经过HTML解码的字符串了。
var output = temp.innerText || temp.textContent;
temp = null;
return output;
}
/**
* Similar to onAfterRendering, but this hook is invoked before the controller’s View is re-rendered
* (NOT before the first rendering! onInit() is used for that one!).
* @memberOf alipay.alipay
*/
// onBeforeRendering: function() {
//
// },
/**
* Called when the View has been rendered (so its HTML is part of the document). Post-rendering manipulations of the HTML could be done here.
* This hook is the same one that SAPUI5 controls get after being rendered.
* @memberOf alipay.alipay
*/
// onAfterRendering: function() {
//
// },
/**
* Called when the Controller is destroyed. Use this one to free resources and finalize activities.
* @memberOf alipay.alipay
*/
// onExit: function() {
//
// }
});
});[/mw_shl_code]
最后,等我这测试基本可以时,我就想把此运用传输到我的这个网站上来测试一下,才发现,我的这网站空间不支付JAVA,也用不了servlet,这就白浪费研究了几天,明天看来再得重新研究一下PHP的,搞了UI5调用PHP提交支付请求的,在此记录一下,等以后有自己服务时,再把此功能扩展一下,使用JAVA的。
文件下载