公司要弄个云购系统 用支付宝付款 我把用的东西写个记录
我用的是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天 我的云购活动已经结束了 但是客户还是去手机支付宝钱包付款 这时 可以付款成功 但是我不会改变他的状态(我自己的程序逻辑控制的) 不晓得应该怎么让支付宝钱包也不能付款
附上内侧的图片
声明:此文系舞林cuzn(www.wulinlw.org)原创稿件,转载请保留版权