公司刚上sap系统,由于资金有限,sap与其它系统的数据交换需要公司内部实现。于是,领导决定入库申请流程需要在sap与OA系统里实现电子签核流,重担果然落到我的身上。好在我只负责OA,还一位同事负责sap。

OA是用PHP开发的,于是连接语言自然使用PHP。网上搜了下,发现php的saprfc扩展早在2005年就有了,不过虽然过了那么多年,扩展依然可用。

一、下载saprfc扩展并在php.ini启用。访问http://pan.baidu.com/s/1kVPemn9,下载saprfc1.4.1完整版,里面包含windows版php4.4、php5.2、php5.3 dll扩展文件,以及sapclasses文件夹下的接口类等。复制相应版本的php_saprfc_5xx.dll至php的扩展文件夹下,修改php配置文件php.ini,在dynamic extensions下面增加一行:extension=php_saprfc_5xx.dll.然后重启httpd服务。网页访问phpinfo(),出现以下信息,表示php saprfc扩展安装成功。

二、安装sap客户端并根据saprfc1.4.1完整版里的example_userlist.php测试与sap服务器的连接。saprfc本质上是模拟sapGUI登录。所以需要安装rfcsdk才能实现连接。为简化操作,直接安装sapGUI客户端,则rfcsdk也安装完成。同理,若是linux版的php,需安装Non-Unicode SAP RFCSDK 6.40,不过似乎这个东西不好找。然后修改example_userlist.php里的logindata参数为本公司的sap参数保存,例如

$sap = new saprfc(array(
"logindata"=>array(
"ASHOST"=>"yourhostip" // application server
,"SYSNR"=>"00" // system number
,"CLIENT"=>"800" // client
,"USER"=>"youruser" // user
,"PASSWD"=>"yourpwd" // password
,"CODEPAGE"=>"8300" //定义字符集,否则会中文乱码
)
,"show_errors"=>false // let class printout errors
,"debug"=>false)) ; // detailed debugging information

网页访问http://xxxxxx/example_userlist.php,若出现以下信息,表示php与sap通信成功。

三、使用saprfc类连接sap。saprfc1.4.1完整版提供了一系列的类连接sap、调用函数、操作内表,以及创建服务接口等。

$params=array(
"ASHOST"=>"appip" // application server
,"SYSNR"=>"00" // system number
,"CLIENT"=>"600" // client
,"USER"=>"account" // user
,"PASSWD"=>"pwd" // password
//,"LANG"=>"ZH"
,"CODEPAGE"=>"6240" //8400 gbk code
);
include_once("sapclasses/sap.class.php");
$sapConn=new SAPConnection();
$sapConn->Connect($params); // set conncet data array
$sapConn->Open(); // set/get rfc handle $sapConn->rfc
$sapFunc=new SAPFunction();
$sapFunc->Discover($sapConn->rfc,"Z_OA_SIGN");//set/get function handle $sapFunc->fce,z_oa_sign函数名
$para=array(
array("EXPORT","TYP"),//默认情况下export参数不用定义,不过定义也没关系
array("EXPORT","MSG"),
array("IMPORT","ZOANUM",$oanum)
); //rfc函数输入Import,输出export参数定义
$sapFunc->DefVars($para); //DefVars方法在类里面并没有,需要手动加入,代码见下文。
$sapFunc->Call();
//echo $sapFunc->TYP;
//echo $sapFunc->MSG;
if($sapFunc->TYP=="S")echo "S"; //TYP、MSG为rfc函数的返回值
else echo $sapFunc->MSG;
$sapFunc->Close();
$sapConn->Close();

SAPFunction类的DefVars方法:

function DefVars($parameters){
foreach ($parameters as $key => $param) {
$type=$param[0];
$name=$param[1];
$value=isset($param[2])?$param[2]:"";
switch ($type) {
case "IMPORT":
$this->$name=$value;
break;
case "EXPORT":
$this->$name="";
break;
default:
return "saprfc::callFunction() Wrong Parameter-Type. Must be IMPORT, EXPORT or TABLE.";
}
}
}

掌握了以上代码后,估计使用php连接sap已不是什么难事了。

php5.2通过saprfc扩展远程连接sap730成功案例的更多相关文章

  1. windows下使用xShell远程连接virtualbox里面的linux

    第一阶段:基本安装 安装virtual box 在virtualbox里面安装xubuntu:是ubuntu+xfce桌面环境的一个linux的发行版本 在windows下安装Xmanager Ent ...

  2. 远程连接mongodb出现 no route to host 和 Connection refused

    部署好mongodb服务器后,在客户端安装好php的mongodb扩展,用程序连接mongodb服务器出错:no route to host.搜索了差不多一天的时候都没有相关的解决方法.最后在mong ...

  3. Linux使用SSH远程连接方式和更改密码 ,自己空间转移过来的。

    一. 远程连接Linux系统需要一个方便的SSH连接工具putty就不错!工具在本日志的附件下载,解压密码是QQ号,云盘访问密码 90891.把远程主机ip和端口号填写上然后选择连接方式为“SSH”. ...

  4. MongoDb Windows linux平台环境及主流编程语言驱动安装同时配置mongoDb的远程连接

    <一,>MongoDB 简介篇Ruiy; MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值 ...

  5. Kali Linux远程连接Windows服务器

    前言: 为了在Kali上远程连接Windows系统的服务器我们需要安装两个工具,rdesktop和tsclient.另外,我们从主机服务商那里购买的Windows操作系统的服务器都是默认开启了远程连接 ...

  6. 远程连接身份验证错误,又找不到加密Oracle修正

    远程连接服务器出现了错误,错误信息为:远程连接身份验证错误,又找不到加密Oracle修正. 服务器系统:Windows Server2016 客户端系统:Windows10家庭版和专业版   出错原因 ...

  7. (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)

    在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机 前提:服务器端安装桌面版的centos系统 CentOS Linux release 7.5.1804 (Core) ...

  8. .Net开源myrtille远程连接服务(支持SSH)

    今天在博客园首页,无意中看到一篇文章(https://github.com/Microsoft/dotnet/blob/master/dotnet-developer-projects.md),于是对 ...

  9. SSH远程连接服务

    一.SSH 原理图 二.SSH 原理描述 2.1:什么是SSH SSH是专门为了远程登录会话和其他网络服务提供的安全性协议,使用SSH协议可以有效的防止远程连接会话的时候出现信息泄密,在数据传输的时候 ...

随机推荐

  1. WWDC2014之App Extensions学习笔记

    一.关于App Extensions extension是iOS8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补iOS的沙盒机制对应用间通信的限制. extension的出现,为用户 ...

  2. Egret HTTP网络

    HTTP 请求与响应: private createGameScene():void { //HTTP 1.0 var request = new egret.HttpRequest(); reque ...

  3. 如何用extjs显示一个已经存在的页面

    最近碰到了一个需求: 画面上有个按钮,点击了按钮之后,弹出一个窗体(window),而该窗体(window)上显示的内容是某个系统的内容,如下图所示 查了好长时间的extjs的帮助文档,没有找个现成的 ...

  4. 【转】java提高篇(二三)-----HashMap

    原文网址: http://www.cnblogs.com/chenssy/p/3521565.html HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以 ...

  5. 【转】BLE 学习记录

    原文网址:http://m.blog.csdn.net/blog/chiooo/43985401 BLE 学习记录 ANROID BLE 开发,基于 bluetoothlegatt 分析 mBluet ...

  6. 201512读书分享——读《做自己的No.1》“哪一天”是永远不会到来的

    在看这本书的同时,最近也看了一部电影叫做<令人怦然心动的人生整理魔法>,讲一个女孩子平常不善收理,然后房间和人生乱七八糟,她总想着“等哪一天有空了就收拾”.但是,最终一句话打醒了——“哪一 ...

  7. 安装robotframework时提示权限受限

    mba下准备装robotframework,python已默认装好,按照如下的教程继续按照robotframework,发现会提示权限受限,如图. 第二步: 安装 robotframework下载地址 ...

  8. cf601A The Two Routes

    A. The Two Routes time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  9. HDU4099 Revenge of Fibonacci(高精度+Trie)

    Revenge of Fibonacci Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 204800/204800 K (Java/ ...

  10. poj1009

    题目大意:边缘检测 IONU卫星成像公司,公司记录和储存非常大的图片使用行程编码,你需要编写一个程序读取被压缩的图像,发现图像的边缘,描述如下,并且输出另一个发现的边缘压缩图像. 一个简单的边缘检测算 ...