微信中使用支付宝手机版,浏览器中打开,PHP完整综合版含回调

推荐文章 微信H5支付完整版含PHP回调页面.代码精简2018年2月
支付宝手机支付,本身有提供一个手机网站支付DEMO,是lotusphp版本的,里面有上百个文件,非常复杂.本文介绍的接口,
只需通过一个PHP文件即可实现手机支付宝接口的付款,非常简洁,并兼容微信.
代码在最下面.

注意事项(重要):
一,支付宝接口已经升级了加密方式,现在申请的接口都是公钥加私钥的加密形式.公钥与私钥都需要申请者自己生成,而且是成对的,不能拆开用.并把公钥保存到支付宝平台,该公钥对应的私钥不需要保存在支付宝,只能自己保存,并放在api支付宝接口文件中使用.下面会提到.

APPID 应该填哪个呢? 这个是指开放平台id,格式应该填2018或2016等日期开头的,不要填合作者pid,那个pid新版不需要的.APPID下面还对应一个网关.这个也要对应填写.正式申请通过的网关为https://openapi.alipay.com/gateway.do 如果你是沙箱测试账号,
则填https://openapi.alipaydev.com/gateway.do 注意区别
密钥生成方式为, https://docs.open.alipay.com/291/105971 打开这个地址,下载该相应工具后,解压打开文件夹,运行“RSA签名验签工具.bat”这个文件后.打开效果如下图
如果你的网站是jsp的,密钥格式如下图,点击选择第一个pkcs8的,如果你的网站是php,asp等,则点击pkcs1
密钥长度统一为2048位.
然后点击 生成密钥
然后,再点击打开密钥文件路径按钮.即可看到生成的密钥文件,打开txt文件.即可看到生成的公钥与私钥了.
公钥复制后(注意不要换行),需提供给支付宝账号管理者,并上传到支付宝开放平台。如下图第二
界面示例:
这里写图片描述
这里写图片描述

关于支付宝公钥这边说明2点:

  1.RSA格式对应的后边的支付宝公钥每个商家的都是一样的,RSA2格式每个商户的支付宝公钥都不一样!

  2.支付宝公钥用于同步通知和异步通知验签,切勿和应用公钥混淆了!两个回调验证签名一律使用支付宝公钥!**不可用应用公钥.**

二,如
下,同步回调地址与异步回调地址的区别.
同步地址是指用户付款成功,他自动跳转到这个地址,以get方式返回,你可以设置为跳转回会员中心,也可以转到网站首页或充值日志页面,通过$_GET 的获取支付宝发来的签名,金额等参数.然后进本地数据库验证支付是否正常.
而异步回调地址指支付成功后,支付宝会自动多次的访问你的这个地址,以静默方式进行,用户感受不到地址的跳转.注意,异步回调地址中不能有问号,&等符号,如果有,可能需要对url网址进行编码.可以放在根目录中.如果你设置为notify_url.php,则你也需要在notify_url.php这个文件中做个判断.比如如果用户付款成功了.则用户的余额则增加多少,充值状态由付款中.修改为付款成功等.

$returnUrl = 'http://域名/user/h5_alipay/return_url.php';     //付款成功后的 同步回调地址,可直接设置为会员中心的地址
$notifyUrl = 'http://域名/notify_url.php';     //付款成功后的异回调地址,如果你的回调地址中包含&符号,最好把回调直接放根目录

三,orderName 订单名称,注意编码,否则签名可能会失败
向支付宝发起支付请求时,有个orderName 订单名称参数.注意这个参数的编码,如果你的本页面是gb2312编码,$this->charset = ‘UTF-8’这个参数最好还是UTF-8,不需要修改.否则签名时,可能会出现各种问题.,可用下面的方法做个转码.

$orderName=iconv("GB2312//IGNORE","UTF-8",'支付宝充值'); 

四,微信中如何使用支付宝
支付宝有方案,可以进这个页面把ap.js及pay.htm下载后,保存到你的支付文件pay.php文件所在的目录中.
方案解释,会员在微信中打开你网站的页面,登录,并点击充值或购买链接时,他如果选择支付宝付款,则ap.js会自动弹出这个pay.htm页面,提示你在右上角选择用浏览器中打开,打开后,自动跳转到支付宝app中,不需要重新登录原网站的会员即可完成充值,并跳转回去.
注意,在你的客户从微信转到手机浏览器后,并没有让你重新登录你的商城网站,这是本方案的优势所在.
https://docs.open.alipay.com/203/105285/

这里写图片描述

五,如果你申请的支付宝手机支付接口在审核中,则可以先申请一个沙箱测试账号,该账号申请后就可以使用非常方便.同时会提供你一个支付宝商家账号及买家测试账号.登录即可测试付款情况.

这里写图片描述

代码如下(参考)
一.表单付款按钮所在页面代码

<?
include("../../config/conn.php");
include("../../config/function.php");
sesCheck_m();
?>
<html>
<head>
<meta http-equiv="x-ua-compatible" content="ie=7" />
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
<title>会员中心 <?=webname?></title>
<script language="javascript">
function xz(x){
document.getElementById(x).checked=true;    
}

function tj(){
 t1v=document.f1.t1.value;
 if(t1v.replace(/\s/,"")=="" || isNaN(t1v)){layerts("请输入充值金额");return false;}
 r=document.getElementsByName("R1");
 rv="";
 for(i=0;i<r.length;i++){if(r[i].checked==true){rv=r[i].value;}}
 if(rv==""){layerts("请选择支付方式");return false;}
 if(rv=="alipay" || rv==""){fu="h5_alipay/wappay/pay.php";}
 <? if ( strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') == false ) {?>
 else if(rv=="wxpay"){f1.action="wxpay/h5_pay.php";}//微信中,不可以使用微信h5支付.只可用公众号支付.
 <? }else{?>
 else if(rv=="wxpay"){f1.action="wxpay/wxpay_jspay_pay.php";}
 <? }?>

 tjwait();
 f1.action=fu;
}
</script>
</head>
<body>
<form name="f1" method="post" onSubmit="return tj()">
<input type="hidden" value="pay" name="jvs" />
 <div class="d1">充值金额</div>
<input type="text" name="t1" class="inp" style="font-weight:700;color:#ff6600;" value="0.01" />
<br/>
<input name="R1" id="alipay" type="radio" value="alipay" /><img onClick="xz('alipay')" src="../../user/img/pay/alipay.gif" />
<br/>
<input type="submit" class="tjinput" value="立即充值" />
</form>
 </div>
</body>
</html>

二,pay.php页面代码(核心代码)

<?php
header('Content-type:text/html; Charset=GB2312');
$appid = '2016091200492600';  //https://open.alipay.com 账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID
$notifyUrl = 'http://域名/user/h5_alipay/notify_url.php';     //付款成功后的异步回调地址支付宝以post的方式回调
$returnUrl = 'http://域名/user/pay_chongzhi.php';     //付款成功后,支付宝以 get同步的方式回调给发起支付方
$sj=date("Y-m-d H:i:s");
$userid=returnuserid($_SESSION["SHOPUSER"]);
$ddbh=$bh="h5_ali_".time()."_".$userid;//订单编号
$uip=$_SERVER["REMOTE_ADDR"];//ip地址
$money1=$_POST[t1];

//bz备注,ddzt与alipayzt及ifok表示订单状态,
intotable("yjcode_dingdang","bh,ddbh,userid,sj,uip,money1,ddzt,alipayzt,bz,ifok","'".$bh."','".$ddbh."',".$userid.",'".$sj."','".$uip."',".$money1.",'等待买家付款','','支付宝充值',0");//订单入库
//die(mysql_error());//数据库错误

//订单名称
 $orderName=iconv("GB2312//IGNORE","UTF-8",'支付宝充值'); //注意编码
$body = $orderName=iconv("GB2312//IGNORE","UTF-8",'支付宝充值'); 
$outTradeNo = $ddbh;     //你自己的商品订单号
$payAmount = $money1;          //付款金额,单位:元
$signType = 'RSA2';       //签名算法类型,支持RSA2和RSA,推荐使用RSA2
$saPrivateKey='这里填2048位的私钥';//私钥
$aliPay = new AlipayService($appid,$returnUrl,$notifyUrl,$saPrivateKey);
$payConfigs = $aliPay->doPay($payAmount,$outTradeNo,$orderName,$returnUrl,$notifyUrl);
class AlipayService
{
    protected $appId;
    protected $returnUrl;
    protected $notifyUrl;
    protected $charset;
    //私钥值
    protected $rsaPrivateKey;
    public function __construct($appid, $returnUrl, $notifyUrl,$saPrivateKey)
    {
        $this->appId = $appid;
        $this->returnUrl = $returnUrl;
        $this->notifyUrl = $notifyUrl;
        $this->charset = 'UTF-8';
        $this->rsaPrivateKey=$saPrivateKey;
    }
    /**
     * 发起订单
     * @param float $totalFee 收款金额 单位元
     * @param string $outTradeNo 订单号
     * @param string $orderName 订单名称
     * @param string $notifyUrl 支付结果通知url 不要有问号
     * @param string $timestamp 订单发起时间
     * @return array
     */
    public function doPay($totalFee, $outTradeNo, $orderName, $returnUrl,$notifyUrl)
    {
        //请求参数
        $requestConfigs = array(
            'out_trade_no'=>$outTradeNo,
            'product_code'=>'QUICK_WAP_WAY',
            'total_amount'=>$totalFee, //单位 元
            'subject'=>$orderName,  //订单标题
        );
        $commonConfigs = array(
            //公共参数
            'app_id' => $this->appId,
            'method' => 'alipay.trade.wap.pay', //接口名称
            'format' => 'JSON',
            'return_url' => $returnUrl,
            'charset'=>$this->charset,
            'sign_type'=>'RSA2',
            'timestamp'=>date('Y-m-d H:i:s'),
            'version'=>'1.0',
            'notify_url' => $notifyUrl,
            'biz_content'=>json_encode($requestConfigs),
        );
        $commonConfigs["sign"] = $this->generateSign($commonConfigs, $commonConfigs['sign_type']);
        return $commonConfigs;
    }
    public function generateSign($params, $signType = "RSA") {
        return $this->sign($this->getSignContent($params), $signType);
    }
    protected function sign($data, $signType = "RSA") {
        $priKey=$this->rsaPrivateKey;
        $res = "-----BEGIN RSA PRIVATE KEY-----\n" .
            wordwrap($priKey, 64, "\n", true) .
            "\n-----END RSA PRIVATE KEY-----";
        ($res) or die('您使用的私钥格式错误,请检查RSA私钥配置');
        if ("RSA2" == $signType) {
            openssl_sign($data, $sign, $res, version_compare(PHP_VERSION,'5.4.0', '<') ? SHA256 : OPENSSL_ALGO_SHA256); //OPENSSL_ALGO_SHA256是php5.4.8以上版本才支持
        } else {
            openssl_sign($data, $sign, $res);
        }
        $sign = base64_encode($sign);
        return $sign;
    }
    /**
     * 校验$value是否非空
     *  if not set ,return true;
     *    if is null , return true;
     **/
    protected function checkEmpty($value) {
        if (!isset($value))
            return true;
        if ($value === null)
            return true;
        if (trim($value) === "")
            return true;
        return false;
    }
    public function getSignContent($params) {
        ksort($params);
        $stringToBeSigned = "";
        $i = 0;
        foreach ($params as $k => $v) {
            if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) {
                // 转换成目标字符集
                $v = $this->characet($v, $this->charset);
                if ($i == 0) {
                    $stringToBeSigned .= "$k" . "=" . "$v";
                } else {
                    $stringToBeSigned .= "&" . "$k" . "=" . "$v";
                }
                $i++;
            }
        }
        unset ($k, $v);
        return $stringToBeSigned;
    }
    /**
     * 转换字符集编码
     * @param $data
     * @param $targetCharset
     * @return string
     */
    function characet($data, $targetCharset) {
        if (!empty($data)) {
            $fileType = $this->charset;
            if (strcasecmp($fileType, $targetCharset) != 0) {
                $data = mb_convert_encoding($data, $targetCharset, $fileType);
            }
        }
        return $data;
    }
}
function isWeixin(){
    if ( strpos($_SERVER['HTTP_USER_AGENT'],'MicroMessenger') !== false ) {
        return true;
    }
    return false;
}
$queryStr = http_build_query($payConfigs);
if(isWeixin()):

//注意下面的ap.js ,文件的存在目录,如果不确定.可以写绝对地址.否则可能微信中没法弹出提示窗口,
?>
<script type="text/javascript" src="ap.js"></script>
<script>
    var gotoUrl = 'https://openapi.alipaydev.com/gateway.do?<?=$queryStr?>';
    //注意上面及下面的alipaydev.com,用的是沙箱接口,去掉dev表示正式上线
    _AP.pay(gotoUrl);
</script>
<?php
    else:
    //print_r(($orderName.$body));exit;
        header("Location:https://openapi.alipaydev.com/gateway.do?{$queryStr}");
    endif;
?>

三,回调页面案例一,即notify_url.php文件. post回调,

<?php
header('Content-type:text/html; Charset=GB2312');
//支付宝公钥,账户中心->密钥管理->开放平台密钥,找到添加了支付功能的应用,根据你的加密类型,查看支付宝公钥
$alipayPublicKey='';
$aliPay = new AlipayService($alipayPublicKey);
//验证签名,如果签名失败,注意编码问题.特别是有中文时,可以换成英文,再测试
$result = $aliPay->rsaCheck($_POST,$_POST['sign_type']);
if($result===true){
    //处理你的逻辑,例如获取订单号$_POST['out_trade_no'],订单金额$_POST['total_amount']等
    //程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h);
    $out_trade_no = $_POST['out_trade_no'];

    //支付宝交易号

    $trade_no = $_POST['trade_no'];

    //交易状态
    $trade_status = $_POST['trade_status'];

  switch($trade_status){
      case "WAIT_BUYER_PAY";
      $nddzt="等待买家付款";
      break;
      case "TRADE_FINISHED":
      case "TRADE_SUCCESS";
      $nddzt="交易成功"; 
      break;
      }

      if(empty($trade_no)){echo "success";exit;}
      //注意,这里的查询不能 强制用户登录,则否支付宝没法进入本页面.没法通知成功
$sql="select ifok,jyh from yjcode_dingdang where ifok=1 and jyh='".$trade_no."'";mysql_query("SET NAMES 'GBK'");$res=mysql_query($sql);//支付宝生成的流水号
if($row=mysql_fetch_array($res)){echo "success";exit;}


$sql="select * from yjcode_dingdang where ddbh='".$out_trade_no."' and ifok=0 and ddzt='等待买家付款'";
mysql_query("SET NAMES 'GBK'");
$res=mysql_query($sql);
if($row=mysql_fetch_array($res)){
     if(1==$row['ifok']){echo "success";exit;}

 if($trade_status=="TRADE_SUCCESS" || $trade_status=="TRADE_FINISHED"){

     if($row['money1']== $_POST['total_fee'] ){
         $sj=time();$uip=$_SERVER["REMOTE_ADDR"];
     updatetable("yjcode_dingdang","sj='".$sj."',uip='".$uip."',alipayzt='".$trade_status."',ddzt='".$nddzt."',ifok=1,jyh='".$trade_no."' where id=".$row[id]);
 $money1=$row["money1"];//修改订单状态为成功付款
 PointIntoM($userid,"支付宝充值".$money1."元",$money1);//会员余额增加


 echo "success";exit;    
     }

 }

}

    //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——


    echo 'success';exit();
}
echo 'fail';exit();
class AlipayService
{
    //支付宝公钥
    protected $alipayPublicKey;
    protected $charset;
    public function __construct($alipayPublicKey)
    {
        $this->charset = 'utf8';
        $this->alipayPublicKey=$alipayPublicKey;
    }
    /**
     *  验证签名
     **/
    public function rsaCheck($params) {
        $sign = $params['sign'];
        $signType = $params['sign_type'];
        unset($params['sign_type']);
        unset($params['sign']);
        return $this->verify($this->getSignContent($params), $sign, $signType);
    }
    function verify($data, $sign, $signType = 'RSA') {
        $pubKey= $this->alipayPublicKey;
        $res = "-----BEGIN PUBLIC KEY-----\n" .
            wordwrap($pubKey, 64, "\n", true) .
            "\n-----END PUBLIC KEY-----";
        ($res) or die('支付宝RSA公钥错误。请检查公钥文件格式是否正确');
        //调用openssl内置方法验签,返回bool值
        if ("RSA2" == $signType) {
            $result = (bool)openssl_verify($data, base64_decode($sign), $res, version_compare(PHP_VERSION,'5.4.0', '<') ? SHA256 : OPENSSL_ALGO_SHA256);
        } else {
            $result = (bool)openssl_verify($data, base64_decode($sign), $res);
        }
//        if(!$this->checkEmpty($this->alipayPublicKey)) {
//            //释放资源
//            openssl_free_key($res);
//        }
        return $result;
    }
    /**
     * 校验$value是否非空
     *  if not set ,return true;
     *    if is null , return true;
     **/
    protected function checkEmpty($value) {
        if (!isset($value))
            return true;
        if ($value === null)
            return true;
        if (trim($value) === "")
            return true;
        return false;
    }
    public function getSignContent($params) {
        ksort($params);
        $stringToBeSigned = "";
        $i = 0;
        foreach ($params as $k => $v) {
            if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) {
                // 转换成目标字符集
                $v = $this->characet($v, $this->charset);
                if ($i == 0) {
                    $stringToBeSigned .= "$k" . "=" . "$v";
                } else {
                    $stringToBeSigned .= "&" . "$k" . "=" . "$v";
                }
                $i++;
            }
        }
        unset ($k, $v);
        return $stringToBeSigned;
    }
    /**
     * 转换字符集编码
     * @param $data
     * @param $targetCharset
     * @return string
     */
    function characet($data, $targetCharset) {
        if (!empty($data)) {
            $fileType = $this->charset;
            if (strcasecmp($fileType, $targetCharset) != 0) {
                $data = mb_convert_encoding($data, $targetCharset, $fileType);
                //$data = iconv($fileType, $targetCharset.'//IGNORE', $data);
            }
        }
        return $data;
    }
}

四.异步回调案例2, 与上面三是重复的,可选择其中一个.本回调可直接放根目录中 如果你服务器不支持mysqli 就替换为mysql 测试回调时, 请先直接访问本页面,进行测试.订单号可以先写一个固定值.

<?php


define('PHPS_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR);

 //$_POST['trade_no']=1;

if($_POST['trade_no']){

$alipayPublicKey='MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyg8BC9UffA4ZoMl12zz';//RSA公钥,与支付时的私钥对应
$aliPay = new AlipayService2($alipayPublicKey);


//验证签名
$result = $aliPay->rsaCheck($_POST,$_POST['sign_type']);
    //file_put_contents('333.txt',$_POST);
if($result===true){
    //处理你的逻辑,例如获取订单号$_POST['out_trade_no'],订单金额$_POST['total_amount']等

    $out_trade_no = $_POST['out_trade_no'];

    //$out_trade_no = '2018022300293843964';
//支付宝交易号
    $trade_no = $_POST['trade_no'];

    //交易状态
    $trade_status = $_POST['trade_status'];
    //$trade_status='';
     $userinfo = array();
         if($trade_status=="TRADE_SUCCESS" || $trade_status=="TRADE_FINISHED"){
            //ini_set('display_errors',1);            //错误信息  
//ini_set('display_startup_errors',1);    //php启动错误信息  
//error_reporting(-1);                    //打印出所有的 错误信息
        $mysql_user=include(PHPS_PATH.'/caches/configs/database.php');
        $username=$mysql_user['default']['username'];
        $password=$mysql_user['default']['password'];
        $tablepre=$mysql_user['default']['tablepre'];
        $database=$mysql_user['default']['database'];

        $con = mysqli_connect($mysql_user['default']['hostname'],$username,$password);

mysqli_select_db($con,$database);   
$sql = ' SELECT * FROM '.$tablepre."pay_account where trade_sn='".$out_trade_no."'";

$result2=mysqli_query($con,$sql);

$orderinfo=mysqli_fetch_array($result2);;


$uid=$orderinfo['userid'];
$sql2 = ' SELECT * FROM '.$tablepre."member where userid=".$uid;
    $result1=mysqli_query($con,$sql2);
$userinfo=mysqli_fetch_array($result1);;



        if($orderinfo){

            if($orderinfo['status']=='succ'){
            //file_put_contents('31.txt',1);
                 echo 'success';
                 mysqli_close($con);
                 exit();
            }else{

                    // if($orderinfo['money']== $_POST['total_amount'] ){

                                $money = $orderinfo['money'];
            $amount = $userinfo['amount'] + $money;
        $sql3 = ' update  '.$tablepre."member set amount= ".$amount."  where userid=".$uid;
        $result3=mysqli_query($con,$sql3);



    $sql4 = ' update  '.$tablepre."pay_account set status= 'succ'  where userid=".$uid ." and trade_sn='".$out_trade_no."'";
        $result4=mysqli_query($con,$sql4);

//file_put_contents('1.txt',$result4);

                 echo 'success';
                 mysqli_close($con);
                 exit(); 

                //   }


            }

        } else {

             echo 'success';exit();
        }    
         }


    echo 'success';exit();
}
echo 'fail';exit();
}








class AlipayService2
{
    //支付宝公钥
    protected $alipayPublicKey;
    protected $charset;
    public function __construct($alipayPublicKey)
    {
        $this->charset = 'utf8';
        $this->alipayPublicKey=$alipayPublicKey;
    }
    /**
     *  验证签名
     **/
    public function rsaCheck($params) {
        $sign = $params['sign'];
        $signType = $params['sign_type'];
        unset($params['sign_type']);
        unset($params['sign']);
        return $this->verify($this->getSignContent($params), $sign, $signType);
    }
    function verify($data, $sign, $signType = 'RSA') {
        $pubKey= $this->alipayPublicKey;
        $res = "-----BEGIN PUBLIC KEY-----\n" .
            wordwrap($pubKey, 64, "\n", true) .
            "\n-----END PUBLIC KEY-----";
        ($res) or die('支付宝RSA公钥错误。请检查公钥文件格式是否正确');
        //调用openssl内置方法验签,返回bool值
        if ("RSA2" == $signType) {
            $result = (bool)openssl_verify($data, base64_decode($sign), $res, version_compare(PHP_VERSION,'5.4.0', '<') ? SHA256 : OPENSSL_ALGO_SHA256);
        } else {
            $result = (bool)openssl_verify($data, base64_decode($sign), $res);
        }
//        if(!$this->checkEmpty($this->alipayPublicKey)) {
//            //释放资源
//            openssl_free_key($res);
//        }
        return $result;
    }
    /**
     * 校验$value是否非空
     *  if not set ,return true;
     *    if is null , return true;
     **/
    protected function checkEmpty($value) {
        if (!isset($value))
            return true;
        if ($value === null)
            return true;
        if (trim($value) === "")
            return true;
        return false;
    }
    public function getSignContent($params) {
        ksort($params);
        $stringToBeSigned = "";
        $i = 0;
        foreach ($params as $k => $v) {
            if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) {
                // 转换成目标字符集
                $v = $this->characet($v, $this->charset);
                if ($i == 0) {
                    $stringToBeSigned .= "$k" . "=" . "$v";
                } else {
                    $stringToBeSigned .= "&" . "$k" . "=" . "$v";
                }
                $i++;
            }
        }
        unset ($k, $v);
        return $stringToBeSigned;
    }
    /**
     * 转换字符集编码
     * @param $data
     * @param $targetCharset
     * @return string
     */
    function characet($data, $targetCharset) {
        if (!empty($data)) {
            $fileType = $this->charset;
            if (strcasecmp($fileType, $targetCharset) != 0) {
                $data = mb_convert_encoding($data, $targetCharset, $fileType);
                //$data = iconv($fileType, $targetCharset.'//IGNORE', $data);
            }
        }
        return $data;
    }
}

?>

请打赏谢谢大佬

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最近几年,Lotus Domino/Notes在国内的应用范围及水平迅速发展。Domino/Notes已经进入到每一个行业:政府、金融、电信、保险、IT、制造……。已经成为办公自动化和电子协作平台的标准,许多人正在Domino/Notes平台上处理各种办公事务,和大家协同工作。 工作流,企业内部或企业之间协同工作不可或缺的技术,正是Domino技术的长处所在。Domino提供了各种工作流应用所必需的技术,如:简单多样的文档邮递技术、通过读者域和作者域控制文档的存取权限、文档的自动加密和签名等等。Lotus的开发者们利用这些技术,开发了各式各样实用的、适合国国情的工作流应用,这些应用正在各个行业为大家服务。为提高工作生产效率发挥着自己的效力。 最近,Lotus又在Domino之上推出了一个的图形化的、专业的工作流开发工具——Domino Workflow,有了它,可以让工作流的开发工作更加简单,功能更为强大。 回想自己学习Domino Workflow的经历,也算有些坎坷,因为这方面的资料很少,Domino Workflow的帮助库虽然比较完整,但是缺乏一个主线,而且没有一些实用技巧的介绍。心一直有一个想法,就是将自己掌握的Domino Workflow的知识写出来,与大家一起分享。现在,这个想法终于可以实现了。 Domino Workflow是一个非常强大的工具,当真正接触以后,真有一种博大精深,值得不断发掘的感觉。本书吸取了Domino Workflow帮助库的精华,加入了作者在学习和具体实施时遇到的一些实际问题和解决问题的技巧,加以精心整理,形成了一部比较完整和实用的教材。 本书分为九章,从介绍Domino Workflow的原理、设计思想开始,循序渐进地介绍了Domino Workflow的安装、使用、管理和开发的技术要点和注意事项。在本书,通过一个实际应用——报销申请的开发和不断完善,展示了在Domino Workflow可以使用的各种技巧。 本书的主要编写目的是给那些希望使用Domino Workflow来开发工作流应用的人们,对于Domino Workflow的最终用户,也可以从本书的第一到第四章获得有价值的东西。 在信息技术飞速发展的今天,作为IT从业人员,必须不断地学习,更新和升级自己的知识,才能跟上时代的脚步,而不至于被甩在后面。希望本书能够为大家在学习Domino Workflow时带来一些帮助,使大家少走一些弯路,迅速掌握它,并将它转化为生产力。 由于时间比较仓促,书不妥之处在所难免,敬请广大读者朋友批评指正!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值