【微信】云购系统+支付宝付款

Continue Read..

公司要弄个云购系统  用支付宝付款  我把用的东西写个记录

 

我用的是TP  3.2版本写的  

Alipay.zip   这个附件放到ThinkPHP/Library目录里面

PayController.class.zip   这个文件是 支付提交的   写在Application/Home/Controller

懒得下附件的话 可以看我下面贴的代码

<?php

// +----------------------------------------------------------------------

// | 微信 系统

// +----------------------------------------------------------------------

// | 作者  cuzn

// +----------------------------------------------------------------------

// | 支付处理

// +----------------------------------------------------------------------

 

namespace Home\Controller;

use Think\Controller;

class PayController extends Controller {

 

public function _initialize() {

header("Content-Type:text/html;charset=utf8");

    }

public function success($orderID,$arr=array()){

if(!empty($orderID)){

            $alipay_config=C('alipay_config');

            $alipay_config['partner'] = $arr['partner'];

            $alipay_config['key'] = $arr['key'];

/**************************请求参数**************************/

$payment_type = "1"; //支付类型 //必填,不能修改

$notify_url = $arr['notify_url']; //服务器异步通知页面路径

$call_back_url = $arr['return_url']; //页面跳转同步通知页面路径

$seller_email = $arr['seller_email'];//卖家支付宝帐户必填

$out_trade_no = $orderID;//商户订单号 通过支付页面的表单进行传递,注意要唯一!

$subject = $arr['title'];  //订单名称 //必填 通过支付页面的表单进行传递

$total_fee = $arr['zfmoney'];   //付款金额  //必填 通过支付页面的表单进行传递

//$total_fee = 0.1;

$body = $arr['note'];  //订单描述 通过支付页面的表单进行传递

$show_url = "";  //商品展示地址 通过支付页面的表单进行传递

$merchant_url = "";

$anti_phishing_key = "";//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数

$exter_invoke_ip = get_client_ip(); //客户端的IP地址 

/************************************************************/

$format = "xml";

$v = "2.0";

$req_id = date('Ymdhis');

$req_data = '<direct_trade_create_req><notify_url>' . $notify_url . '</notify_url><call_back_url>' . $call_back_url . '</call_back_url><seller_account_name>' . $seller_email . '</seller_account_name><out_trade_no>' . $out_trade_no . '</out_trade_no><subject>' . $subject . '</subject><total_fee>' . $total_fee . '</total_fee><merchant_url>' . $merchant_url . '</merchant_url></direct_trade_create_req>';

 

//构造要请求的参数数组,无需改动

$para_token = array(

"service" => "alipay.wap.trade.create.direct",

"partner" => trim($alipay_config['partner']),

"sec_id" => trim($alipay_config['sign_type']),

"format" => $format,

"v" => $v,

"req_id" => $req_id,

"req_data" => $req_data,

"_input_charset" => trim(strtolower($alipay_config['input_charset']))

);

//建立请求

                            //这里是php5.3+  TP3.2+版本new的方法  要有命名空间  而且要在php文件头定义 

                           //比如  我这里是调用    ThinkPHP/Library  /Alipay  里面的   AlipaySubmit  class

$alipaySubmit = new \Alipay\AlipaySubmit($alipay_config);

$html_text = $alipaySubmit->buildRequestHttp($para_token);

//URLDECODE返回的信息

$html_text = urldecode($html_text);

//解析远程模拟提交后返回的信息

$para_html_text = $alipaySubmit->parseResponse($html_text);

//获取request_token

$request_token = $para_html_text['request_token'];

$req_data = '<auth_and_execute_req><request_token>' . $request_token . '</request_token></auth_and_execute_req>';

 

 

$parameter = array(

"service" => "alipay.wap.auth.authAndExecute",

"partner" => trim($alipay_config['partner']),

"sec_id" => trim($alipay_config['sign_type']),

"format" => $format,

"v" => $v,

"req_id" => $req_id,

"req_data" => $req_data,

"_input_charset" => trim(strtolower($alipay_config['input_charset']))

);

$html_text = $alipaySubmit->buildRequestForm($parameter, 'get', '');

echo $html_text;

}else{

echo "系统错误!";die;

}

}

}

 

 

 

 

现在就是写TP的配置文件  我因为想做成通用的 就把支付宝的

PID  key  和收款邮箱 写到数据库里面条用了  等下详细讲怎么调用的

 

下面的这个数组写到  TP的配置文件里面  Application/Common/Conf/config.php

    'alipay_config'=>array(

        'partner' =>'',   //这里是你在成功申请支付宝接口后获取到的PID;

        'key'=>'',//这里是你在成功申请支付宝接口后获取到的Key

        'sign_type'=>strtoupper('MD5'),

        'input_charset'=> strtolower('utf-8'),

        'cacert'=> getcwd().'\\cacert.pem',

        'transport'=> 'http',

    ),

 

 

下面写处理文件  我这里是个YungouController 的文件 

写一个构造函数  里面  写支付宝的同步,异步回调地址

 

private $notify_url = ''; 

    private $return_url = ''; 

    public function _initialize(){

   

     //这里是判断是否微信分享过来的  这2个参数是分享自动生成的

        $from = I("from");

        $isappinstalled = I("isappinstalled");

        if($from == "singlemessage" || $isappinstalled == "0"){

            $wxcs = 1;

        }else{

            $wxcs = 0;

        }

        

        $this->assign("wxcs",$wxcs );

        

        $yid = I("yid");

        $this->notify_ur = "http://hd.chufw.com/yungou/notifyurl/yid/".$yid."/";

        $this->return_url = "http://hd.chufw.com/yungou/returnurl/yid/".$yid."/";

//主要是讲这里  本来淘宝是不能带参数的  但是tp3.2有个U类型的链接 可以直接 写成类似

http://www.xx.com/cuzn/id/1/pid/1   

这样就可以直接在

cuzn这个函数里面 用I("id")  得到一个get过来的值   相当不错

    }

 

 

 

下面是同步回调地址

    function returnurl(){

   

        $data['yid'] = I("yid",0);

        if(empty($data['yid']) || !is_numeric($data['yid'])){echo "";exit();}

        

 

        /*

            这里就是从数据库查询出  支付宝的 PID  key 还有  收款邮箱(也就是收款账号)

        */

         

        

        $alipay_config=C('alipay_config'); 

        $partner = $data['yungou']['PID'];  

        $key = $data['yungou']['key'];

        $alipay_config['partner'] = "$partner";   //这里是数据库的值附到数据  

        $alipay_config['key'] = "$key";         //这里是数据库的值附到数据  

          //因为等下要把整个数据传到支付宝的核心文件里面去

        unset($_GET['yid']);    //这里一定要注意  这个地方我调试很久 还是孔亮告诉我  淘宝的参数不能有我传的东西  所以自己传来什么 就把这些都删了 只留下淘宝自己传过来的值  不然支付宝会一直返回0  而不是1

        $alipayNotify = new \Alipay\AlipayNotify($alipay_config); //计算得出通知验证结果

        $verify_result = $alipayNotify->verifyReturn();

        if($verify_result) {

            //验证成功

            //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表

            $out_trade_no   = $_GET['out_trade_no'];      //商户订单号

            $trade_no       = $_GET['trade_no'];          //支付宝交易号

            $trade_status   = $_GET['result'];            //支付宝交易号返回状态

            $payment_type   = 1;              //支付类型

                

            $parameter = array(

                "out_trade_no"     => $out_trade_no,      //商户订单编号;

                "trade_no"  => $trade_no,          //支付宝交易号;

                "trade_status"  => $trade_status,       //支付宝交易号返回状态

                "payment_type"  => $payment_type,

            );

            if($_GET['result'] == 'success') {

           

              //这里就是回调付款成功之后  自己处理自己的逻辑  比如改支付状态呀 之类的  自己写

            }    

        }else {

            echo "提交失败1";die;

        }

    }

    

 

 

//淘宝异步

    function notifyurl(){

   

        $data['yid'] = I("yid",0);

        if(empty($data['yid']) || !is_numeric($data['yid'])){echo "";exit();}

        

 

        /*

            这里就是从数据库查询出  支付宝的 PID  key 还有  收款邮箱(也就是收款账号)

        */

         

        

        $alipay_config=C('alipay_config'); 

        $partner = $data['yungou']['PID'];  

        $key = $data['yungou']['key'];

        $alipay_config['partner'] = "$partner";   //这里是数据库的值附到数据  

        $alipay_config['key'] = "$key";         //这里是数据库的值附到数据  

          //因为等下要把整个数据传到支付宝的核心文件里面去

        unset($_GET['yid']);    //这里一定要注意  这个地方我调试很久 还是孔亮告诉我  淘宝的参数不能有我传的东西  所以自己传来什么 就把这些都删了 只留下淘宝自己传过来的值  不然支付宝会一直返回0  而不是1

        $alipayNotify = new \Alipay\AlipayNotify($alipay_config); //计算得出通知验证结果

        $verify_result = $alipayNotify->verifyReturn();

 

        if($verify_result) {

            //这里也要注意   PHP5.3+  TP3.2+  自带class  前面要加个  \  也是命名空间

            $doc = new \DOMDocument(); 

            if ($alipay_config['sign_type'] == 'MD5') {

                $doc->loadXML($_POST['notify_data']);

            }

            

            if ($alipay_config['sign_type'] == '0001') {

                $doc->loadXML($alipayNotify->decrypt($_POST['notify_data']));

            }

            

            if( ! empty($doc->getElementsByTagName( "notify" )->item(0)->nodeValue) ) {

                //商户订单号

                $out_trade_no = $doc->getElementsByTagName( "out_trade_no" )->item(0)->nodeValue;

                //支付宝交易号

                $trade_no = $doc->getElementsByTagName( "trade_no" )->item(0)->nodeValue;

                //交易状态

                $trade_status = $doc->getElementsByTagName( "trade_status" )->item(0)->nodeValue;

                

                $payment_type   = 1;

                

                $parameter = array(

                    "out_trade_no"     => $out_trade_no,      //商户订单编号;

                    "trade_no"  => $trade_no,          //支付宝交易号;

                    "trade_status"  => $trade_status,       //支付宝交易号返回状态

                    "payment_type"  => $payment_type,

                );

                if($trade_status == 'TRADE_FINISHED') {

                 //这里就是回调付款成功之后  自己处理自己的逻辑  比如改支付状态呀 之类的  自己写               

                   echo "success";     //请不要修改或删除

                

                }  else if ($trade_status == 'TRADE_SUCCESS') {

                //这里就是回调付款成功之后  自己处理自己的逻辑  比如改支付状态呀 之类的  自己写

                                        

                   echo "success";     //请不要修改或删除

               }

           }else {

           //验证失败

           echo "fail";        

       }

            }

        }

    }

 

 

 基本上就这么多  我现在还碰到个问题  也就是客户进入了支付页面 我本地生成了一条数据  是未付款的数据

然后比如说 过了3天  我的云购活动已经结束了  但是客户还是去手机支付宝钱包付款  这时 可以付款成功  但是我不会改变他的状态(我自己的程序逻辑控制的)   不晓得应该怎么让支付宝钱包也不能付款

 

 

附上内侧的图片

点击查看原图

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权

【JS】替换alert的弹窗提示

Continue Read..

见代码:

function error_msg(text, callback) {
    $(document.body).append("<div class='zzc1' style='background-color: #777; width: 100%; height: 100%; left:0; top:0; opacity:0.8;z-index:1000; position:fixed; display:none'>");
    $(document.body).append("
");
      $('.zzc1').show();
      $('#msg').show();
    msg_timeout = setTimeout(function () {
        $("#msg").remove();
        $(".zzc1").remove();
        if (callback) callback();
    }, 2000);
}
function success_msg(text,callback) {
    $(document.body).append("
");
    $(document.body).append("
");
      $('.zzc1').show();
      $('#msg').show();
    msg_timeout = setTimeout(function () {
        $("#msg").remove();
        $(".zzc1").remove();
        if (callback) callback();
    }, 2000);
}

 

 

 

 

 

 

function error_msg(text, callback) {

    $(document.body).append("<div class='zzc1' style='background-color: #777; width: 100%; height: 100%; left:0; top:0; opacity:0.8;z-index:1000; position:fixed; display:none'></div>");

    $(document.body).append("<div style='position:fixed;z-index:1001; background:#E32E32;display:none; text-align:center; width:250px; margin-left:-125px; text-align:center; padding:10px 0; left:50%;top:50%;font-weight:bold;color:#fff;font-size:16px; border-radius:2px;box-shadow:3px 3px 3px rgba(0, 0, 0, 0.5)'  id='msg'>" + text + "</div>");

      $('.zzc1').show();

      $('#msg').show();

    msg_timeout = setTimeout(function () {

        $("#msg").remove();

        $(".zzc1").remove();

        if (callback) callback();

    }, 3000);

}

function success_msg(text,callback) {

    $(document.body).append("<div class='zzc1' style='background-color: #777; width: 100%; height: 100%; left:0; top:0; opacity:0.8;z-index:1000; position:fixed; display:none'></div>");

    $(document.body).append("<div style='position:fixed;z-index:1001; display:none; width:250px; text-align:center; margin-left:-125px; font-weight:bold;font-size:18px; border:1px solid #666;color:#fff;box-shadow:rgba(99, 98, 98, 0.498039) 3px 3px 3px; left:50%;top:50%;color:#fff;font-size:16px; padding:10px 0; background-color:red; -webkit-box-sizing:border-box;-moz-box-sizing:border-box; box-sizing:border-box' id='msg'>" + text + "</div>");

      $('.zzc1').show();

      $('#msg').show();

    msg_timeout = setTimeout(function () {

        $("#msg").remove();

        $(".zzc1").remove();

        if (callback) callback();

    }, 3000);

}

声明:此文系舞林cuznwww.wulinlw.org)原创稿件,转载请保留版权