首页 > SAP > FIORI > SAPUI5与支付宝/微信的支付实现-UI5+java实现
2019
08-27

SAPUI5与支付宝/微信的支付实现-UI5+java实现

一开始是想使用完全UI5,实现支付宝的支付,后这应该是不可行的,UI5,这只是端的代码实现,后面找到了支付宝提供的SDK,有JAVA的SDK,做了一下,既然在支付定的沙箱中测试成功了,
一、当然是要开通支付宝的收款功能了,如是通过网页(UI5)那要使用的就是支付宝的“网页手机支付”功能,先到蚂蚁金服开放平台开通,并创建一个运行,具体的申请开能操作网上很多,可以在百度找到。
二、创建运用后,会得到你很多信息,比如APPID,商户的私钥,支付宝的公钥等信息,获取方法问百度。
三、从文档中心,找到资源下载,找到服务器SDK,下载得到支付宝SDK文件,把下载下来的SDK文件放到你的UI5主目录下的WEB-INF/lib/,主要是alipay-sdk-java20161129201425.jar文件(版本不同,文件名应该不同),同时可能还需要把javax.servlet.jar也放到此目录下,生成的程序目录如下。

SAPUI5与支付宝/微信的支付实现-UI5+java实现 - 第1张  | 优通SAP

四、做一个severlet.java,用于调用支付宝的SDK,在此例子附件中的为com.alipay.alipay.java。

以下内容需要积分高于 100 才可浏览

[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来完成付款了

以下内容需要积分高于 200 才可浏览

[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的。

文件下载

最后编辑:
作者:yangsen
本站为个人博客网站,全由我个人维护,记录工作学习过程, 有SAP相关询问专、兼职工作可随时联系我。 有网站相关的问题可直接在文章下方留言,或者联系我。 邮件:yan252@163.com给我。 QQ:415402519

留下一个回复

你的email不会被公开。

eight + 20 =