记住用户名密码
电脑端网页 微信扫码支付和支付宝支付
注意:支付完成后的通知地址中,格式要使用a\5\b\3这种的,而不是a=5&b=3这种的,否则通知不到。
电脑端手机端的微信和支付宝支付都已掌握,贴一下代码备用 ,基于thinkphp
微信:
class WxpayMobile extends Action{
//在类初始化方法中,引入相关类库
public function _initialize() {
header("Content-type:text/html;charset=utf-8");
vendor('WxPayPubHelper.SDKRuntimeException');
define("APPID", C('WX_APPID'));
define("MCHID", C('WX_MCHID'));
define("KEY", C('WX_KEY'));
define("APPSECRET", C('WX_APPSECRET'));
define("JS_API_CALL_URL", C('site_url').U('Wxpay/wap_dowxpay'));
define('SSLCERT_PATH',C('site_url').'/Framework/Extend/Vendor/WxPayPubHelper/cacert/apiclient_cert.pem');
define('SSLKEY_PATH',C('site_url').'/Framework/Extend/Vendor/WxPayPubHelper/cacert/apiclient_key.pem');
define('NOTIFY_URL',C('site_url').'/index.php/Wxpay/通知接口');
define('CURL_TIMEOUT',30);
vendor('WxPayPubHelper.WxPayPubHelper');
}
public function index() {
echo "禁止访问";
}
public function dowxpay(){
//使用统一支付接口
$unifiedOrder = new UnifiedOrder_pub();
$fee = $_POST['pay_cash']*100;
//echo "'".$_POST['mas_id']."'";
//设置统一支付接口参数
//设置必填参数
//appid已填,商户无需重复填写
//mch_id已填,商户无需重复填写
//noncestr已填,商户无需重复填写
//spbill_create_ip已填,商户无需重复填写
//sign已填,商户无需重复填写
$unifiedOrder->setParameter("body","订单付款");//商品描述
//自定义订单号,此处仅作举例
$out_trade_no = $_POST['order_no'];
$unifiedOrder->setParameter("out_trade_no",$out_trade_no);//商户订单号
$unifiedOrder->setParameter("total_fee",$fee);//总金额
$unifiedOrder->setParameter("notify_url",NOTIFY_URL);//通知地址
$unifiedOrder->setParameter("trade_type","NATIVE");//交易类型
//非必填参数,商户可根据实际情况选填
//$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号
//$unifiedOrder->setParameter("device_info","XXXX");//设备号
//$unifiedOrder->setParameter("attach","'".$_POST['mas_id']."'");//附加数据
//$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间
//$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间
//$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记
//$unifiedOrder->setParameter("openid","XXXX");//用户标识
//$unifiedOrder->setParameter("product_id","XXXX");//商品ID
//获取统一支付接口结果
$unifiedOrderResult = $unifiedOrder->getResult();
//print_r($unifiedOrderResult);
//商户根据实际情况设置相应的处理流程
if ($unifiedOrderResult["return_code"] == "FAIL")
{
//商户自行增加处理流程
// echo "通信出错:".$unifiedOrderResult['return_msg']."<br>";
}
elseif($unifiedOrderResult["result_code"] == "FAIL")
{
//商户自行增加处理流程
// echo "错误代码:".$unifiedOrderResult['err_code']."<br>";
//echo "错误代码描述:".$unifiedOrderResult['err_code_des']."<br>";
}
elseif($unifiedOrderResult["code_url"] != NULL)
{
//从统一支付接口获取到code_url
$code_url = $unifiedOrderResult["code_url"];
//商户自行增加处理流程
//......
}
$this->assign('code_url',$code_url);
$this->assign('out_trade_no',$out_trade_no);
$this->display();
}
//支付界面
public function pay_online(){
//获取会员信息
if(!isset($_SESSION['open_id'])){
get_code();
}
$Apply = D('ApplyView');
$where = array(
'id'=>$_GET['out_trade_no'],
);
$my_order=$Apply->where($where)->find();
//$my_order = $Apply->where($where)->find();
if(empty($my_order)){
$this->error('该订单不存在!',U('User/index'));
}elseif($my_order['pay_state']==1){
$this->error('该订单已经支付过!',U('User/index'));
}else{
header("Content-type:text/html;charset=utf-8");
//获取店铺微信支付数据
define("APPID", C('WX_APPID'));
define("MCHID", C('WX_MCHID'));
define("KEY", C('WX_KEY'));
define("APPSECRET", C('WX_APPSECRET'));
define('NOTIFY_URL','http://'.$_SERVER['HTTP_HOST'].'/index.php/Wxpay/notifyurl');
define('CURL_TIMEOUT',30);
vendor('WxPayPubHelper.WxPayPubHelper');
vendor('WxPayPubHelper.SDKRuntimeException');
$out_trade_no = $my_order['id']; //订单号
$fee = $my_order['cost']; //应付金额
//使用jsapi接口
$jsApi = new JsApi_pub();
//=========步骤1:网页授权获取用户openid============
//通过code获得openid
$openid = $_SESSION['open_id'];
//=========步骤2:使用统一支付接口,获取prepay_id============
//使用统一支付接口
$unifiedOrder = new UnifiedOrder_pub();
/* 2015年10月12日 18:27:53 用户子商户付款 ↓*/
//$Shop = M('Shop');
//$shop = $Shop->where('shopid = '.$my_order['shopid'])->find();
//$unifiedOrder->setParameter("sub_appid",$shop['wx_appid']);//子商户号码
// echo $shop['wx_appid'];
// $unifiedOrder->setParameter("sub_mch_id",MCHID);//子商户号码
/* 2015年10月12日 18:27:53 用户子商户付款 ↑*/
//dump($openid);dump($out_trade_no);dump(NOTIFY_URL);
$unifiedOrder->setParameter("openid","$openid");//商品描述
$unifiedOrder->setParameter("body","报名付款");//商品描述
//自定义订单号,此处仅作举例
$unifiedOrder->setParameter("out_trade_no",$out_trade_no);//商户订单号
$unifiedOrder->setParameter("total_fee",$fee*100);//总金额
$unifiedOrder->setParameter("notify_url",NOTIFY_URL);//通知地址
$unifiedOrder->setParameter("trade_type","JSAPI");//交易类型
$prepay_id = $unifiedOrder->getPrepayId();
if($prepay_id==null){
$this->error('发起支付失败,请联系管理员!',U('User/index'));
}
//=========步骤3:使用jsapi调起支付============
$jsApi->setPrepayId($prepay_id);
$jsApiParameters = $jsApi->getParameters();
$this->assign('jsApiParameters',$jsApiParameters);
$this->assign('my_order',$my_order);
$this->assign('share_ok_url',U('User/index'));
$this->assign('title',"微信支付");
$this->display();
}
}
public function wap_dowxpay(){
if($_POST['order_no']){
$_SESSION['order_no'] = $_POST['order_no'];
}
if($_POST['pay_cash']){
$_SESSION['pay_cash'] = $_POST['pay_cash'];
}
if($_SESSION['order_no']){
$out_trade_no = $_SESSION['order_no'];
}
if($_SESSION['pay_cash']){
$fee = $_SESSION['pay_cash'];
}
//使用jsapi接口
$jsApi = new JsApi_pub();
//=========步骤1:网页授权获取用户openid============
//通过code获得openid
if (!isset($_GET['code']))
{
//触发微信返回code码
$url = $jsApi->createOauthUrlForCode(JS_API_CALL_URL);
Header("Location: $url");
}else
{
//获取code码,以获取openid
$code = $_GET['code'];
$jsApi->setCode($code);
$openid = $jsApi->getOpenId();
}
//=========步骤2:使用统一支付接口,获取prepay_id============
//使用统一支付接口
$unifiedOrder = new UnifiedOrder_pub();
//设置统一支付接口参数
//设置必填参数
//appid已填,商户无需重复填写
//mch_id已填,商户无需重复填写
//noncestr已填,商户无需重复填写
//spbill_create_ip已填,商户无需重复填写
//sign已填,商户无需重复填写
$unifiedOrder->setParameter("openid","$openid");//商品描述
$unifiedOrder->setParameter("body","订单付款");//商品描述
//自定义订单号,此处仅作举例
$unifiedOrder->setParameter("out_trade_no",$out_trade_no);//商户订单号
$unifiedOrder->setParameter("total_fee",$fee*100);//总金额
$unifiedOrder->setParameter("notify_url",NOTIFY_URL);//通知地址
$unifiedOrder->setParameter("trade_type","JSAPI");//交易类型
//非必填参数,商户可根据实际情况选填
//$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号
//$unifiedOrder->setParameter("device_info","XXXX");//设备号
//$unifiedOrder->setParameter("attach","XXXX");//附加数据
//$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间
//$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间
//$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记
//$unifiedOrder->setParameter("openid","XXXX");//用户标识
//$unifiedOrder->setParameter("product_id","XXXX");//商品ID
$prepay_id = $unifiedOrder->getPrepayId();
//=========步骤3:使用jsapi调起支付============
$jsApi->setPrepayId($prepay_id);
$jsApiParameters = $jsApi->getParameters();
$this->assign('catename',"微信支付");
$this->assign('pay_cash',$fee);
$this->assign('jsApiParameters',$jsApiParameters);
$this->assign_ur_here('微信支付',array(array('title'=>'微信支付','url'=>U('Index/wap_dowxpay'))));
$this->display('Index:wap_dowxpay');
}
/******************************
服务器异步通知页面方法
其实这里就是将notify_url.php文件中的代码复制过来进行处理
*******************************/
public function notifyurl(){
//使用通用通知接口
$notify = new Notify_pub();
//存储微信的回调
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
$notify->saveData($xml);
//验证签名,并回应微信。
//对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,
//微信会通过一定的策略(如30分钟共8次)定期重新发起通知,
//尽可能提高通知的成功率,但微信不保证通知最终能成功。
if($notify->checkSign() == FALSE){
$notify->setReturnParameter("return_code","FAIL");//返回状态码
$notify->setReturnParameter("return_msg","签名失败");//返回信息
}else{
$notify->setReturnParameter("return_code","SUCCESS");//设置返回码
}
$returnXml = $notify->returnXml();
echo $returnXml;
//==商户根据实际情况设置相应的处理流程,此处仅作举例=======
//$log_name="notify_url.log";//log文件路径
//$this->log_result($log_name,"【接收到的notify通知】:\n".$xml."\n");
if($notify->checkSign() == TRUE)
{
if ($notify->data["return_code"] == "FAIL") {
//此处应该更新一下订单状态,商户自行增删操作
//$this->log_result($log_name,"【通信出错】:\n".$xml."\n");
}
elseif($notify->data["result_code"] == "FAIL"){
//此处应该更新一下订单状态,商户自行增删操作
//$this->log_result($log_name,"【业务出错】:\n".$xml."\n");
}
else{
//此处应该更新一下订单状态,商户自行增删操作
//买家支付成功,开始修改订单的支付方式和付款状态
//$this->log_result($log_name,$out_trade_no."【支付成功0000】:\n".$xml."\n");
$out_trade_no = $notify->data["out_trade_no"];
$Apply=M('Apply');
$data['pay_state']=1;
$data['pay_type']='wxpay';
$ret= $Apply->where(array('id'=>$out_trade_no))->save($data);
if($ret){
echo "success";
}
}
}
}
//查询订单的支付状态
public function order_query(){
//退款的订单号
if (!isset($_POST["out_trade_no"]))
{
$out_trade_no = " ";
}else{
$out_trade_no = $_POST["out_trade_no"];
//使用订单查询接口
$orderQuery = new OrderQuery_pub();
$orderQuery->setParameter("out_trade_no","$out_trade_no");//商户订单号
//获取订单查询结果
$orderQueryResult = $orderQuery->getResult();
//商户根据实际情况设置相应的处理流程,此处仅作举例
if ($orderQueryResult["return_code"] == "FAIL") {
echo json_encode($orderQueryResult["return_code"]);
}
elseif($orderQueryResult["result_code"] == "FAIL"){
echo json_encode($orderQueryResult["result_code"]);
}
else{
echo json_encode($orderQueryResult['trade_state']);
}
}
}
//空操作处理,所有空操作都指向空模块
public function _empty(){
$this->redirect('Empty/index');
}
//获取面包屑标题
protected function assign_ur_here($title,$bread){
//$bread 是一个数组 array $bread = array('title'=>'ThinkPHP','url'=>'ThinkPHP@gmail.com');
$breadcrumb = "<a href=".U('Index/index').">首页</a>";
foreach($bread as $key=>$v){
$breadcrumb.= "><a href='".$v['url']."'>".$v['title']."</a>";
}
$this->assign('breadcrumb',$breadcrumb);
$this->assign('seo_title',$title);
}
}
支付宝:
class AlipayMobile extends Action{
public function _initialize() {
header("Content-type:text/html;charset=utf-8");
}
public function index() {
echo "禁止访问";
}
//doalipay方法
/*该方法其实就是将接口文件包下alipayapi.php的内容复制过来
然后进行相关处理
*/
public function doalipay(){
vendor('Alipay.Corefunction');
vendor('Alipay.Md5function');
vendor('Alipay.Notify');
vendor('Alipay.Submit');
/**************************请求参数**************************/
//这里我们通过TP的C函数把配置项参数读出,赋给$alipay_config;
$alipay_config = array(
'partner' => C('alipay_partner'), //这里是你在成功申请支付宝接口后获取到的PID;
'key' => C('alipay_key'),//这里是你在成功申请支付宝接口后获取到的Key
'private_key_path' => 'key/rsa_private_key.pem',
'ali_public_key_path' => 'key/alipay_public_key.pem',
'sign_type' => strtoupper('MD5'),
'input_charset' => 'utf-8',
'cacert' => getcwd().'\\cacert.pem',
'transport' => 'http',
);
$notify_url = C('site_url').'/index.php/Alipay/通知接口'; //服务器异步通知页面路径
$return_url = C('site_url').U('User/index'); //页面跳转同步通知页面路径
$payment_type = "1"; //支付类型 //必填,不能修改
$seller_email = C('alipay_seller_email');//卖家支付宝帐户必填
$out_trade_no = $_POST['order_no'];//商户订单号 通过支付页面的表单进行传递,注意要唯一!
$subject = "对订单".$_POST['order_no'].'付款'; //订单名称 //必填 通过支付页面的表单进行传递
$total_fee = $_POST['pay_cash']; //付款金额 //必填 通过支付页面的表单进行传递
$body = '订单付款';
$anti_phishing_key = "";//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数
$exter_invoke_ip = get_client_ip(); //客户端的IP地址
/************************************************************/
$extra_common_param = $_SESSION['master']['mas_id'];
//构造要请求的参数数组,无需改动
$parameter = array(
"service" => "create_direct_pay_by_user",
"partner" => trim(C('alipay_partner')),
"payment_type" => $payment_type,
"notify_url" => $notify_url,
"return_url" => $return_url,
"seller_email" => $seller_email,
"out_trade_no" => $out_trade_no,
"subject" => $subject,
"total_fee" => $total_fee,
"body" => $body,
"extra_common_param" => $extra_common_param,
"anti_phishing_key" => $anti_phishing_key,
"exter_invoke_ip" => $exter_invoke_ip,
"_input_charset" => trim(strtolower($alipay_config['input_charset']))
);
//建立请求
$alipaySubmit = new AlipaySubmit($alipay_config);
$html_text = $alipaySubmit->buildRequestForm($parameter,"post", "确认");
echo $html_text;
}
//手机端支付
public function wap_doalipay(){
header("Content-type:text/html;charset=utf-8");
vendor('Wap_alipay.Corefunction');
vendor('Wap_alipay.Md5function');
vendor('Wap_alipay.Notify');
vendor('Wap_alipay.Submit');
$alipay_config = array(
'partner' => C('alipay_partner'), //这里是你在成功申请支付宝接口后获取到的PID;
'key' => C('alipay_key'),//这里是你在成功申请支付宝接口后获取到的Key
'private_key_path' => 'key/rsa_private_key.pem',
'ali_public_key_path' => 'key/alipay_public_key.pem',
'sign_type' => strtoupper('MD5'),
'input_charset' => 'utf-8',
'cacert' => getcwd().'\\cacert.pem',
'transport' => 'http',
);
//返回格式
$format = "xml";
//必填,不需要修改
//返回格式
$v = "2.0";
//必填,不需要修改
//请求号
$req_id = date('Ymdhis');
//必填,须保证每次请求都是唯一
//**req_data详细信息**
//服务器异步通知页面路径
$notify_url = C('site_url').'/index.php/Alipay/wap_notifyurl'; //服务器异步通知页面路径
//需http://格式的完整路径,不允许加?id=123这类自定义参数
//页面跳转同步通知页面路径
$call_back_url = C('site_url').'/index.php/User/index'; //页面跳转同步通知页面路径
//需http://格式的完整路径,不允许加?id=123这类自定义参数
//操作中断返回地址
$merchant_url = C('site_url').'/index.php/User/index'; //页面跳转同步通知页面路径
//用户付款中途退出返回商户的地址。需http://格式的完整路径,不允许加?id=123这类自定义参数
//卖家支付宝帐户
$seller_email = C('alipay_seller_email');
//必填
//商户订单号
$out_trade_no = $_GET['order_no'];
//商户网站订单系统中唯一订单号,必填
//订单名称
$subject = "对订单".$out_trade_no.'付款';
//必填
//查询付款金额
$where=array(
"is_del"=>'0',
"id"=>$out_trade_no
);
$Apply=M('Apply');
$data=$Apply->where($where)->find();
$total_fee = $data['cost']; //必填 通过支付页面的表单进行传递$acount
//dump($out_trade_no);dump($subject);dump($data);dump($total_fee);
//return;
//付款金额
//$total_fee = $_POST['pay_cash']; //必填 通过支付页面的表单进行传递$acount
//必填
$pay_expire = 3; //三分钟有效
//请求业务参数详细
$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><pay_expire>'.$pay_expire.'</pay_expire></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']))
);
//dump($para_token);
//return;
//建立请求
$alipaySubmit = new 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'];
/**************************根据授权码token调用交易接口alipay.wap.auth.authAndExecute**************************/
//业务详细
$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']))
);
//建立请求
$alipaySubmit = new AlipaySubmit($alipay_config);
$html_text = $alipaySubmit->buildRequestForm($parameter, 'get', '确认');
echo $html_text;
}
/******************************
手机支付宝的异步接收
*******************************/
public function wap_notifyurl(){
vendor('Wap_alipay.Corefunction');
vendor('Wap_alipay.Md5function');
vendor('Wap_alipay.Notify');
vendor('Wap_alipay.Submit');
//这里我们通过TP的C函数把配置项参数读出,赋给$alipay_config;
$alipay_config = array(
'partner' => C('alipay_partner'), //这里是你在成功申请支付宝接口后获取到的PID;
'key' => C('alipay_key'),//这里是你在成功申请支付宝接口后获取到的Key
'private_key_path' => 'key/rsa_private_key.pem',
'ali_public_key_path' => 'key/alipay_public_key.pem',
'sign_type' => strtoupper('MD5'),
'input_charset' => 'utf-8',
'cacert' => getcwd().'\\cacert.pem',
'transport' => 'http',
);
//计算得出通知验证结果
$alipayNotify = new AlipayNotify($alipay_config);
$verify_result = $alipayNotify->verifyNotify();
if($verify_result) {//验证成功
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//请在这里加上商户的业务逻辑程序代
//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
//解析notify_data
//注意:该功能PHP5环境及以上支持,需开通curl、SSL等PHP配置环境。建议本地调试时使用PHP开发软件
$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;
if($trade_status == 'TRADE_FINISHED') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
//注意:
//该种交易状态只在两种情况下出现
//1、开通了普通即时到账,买家付款成功后。
//2、开通了高级即时到账,从该笔交易成功时间算起,过了签约时的可退款时限(如:三个月以内可退款、一年以内可退款等)后。
//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
echo "success"; //请不要修改或删除
}
else if ($trade_status == 'TRADE_SUCCESS') {
//买家支付成功,开始修改订单的支付方式和付款状态
//买家支付成功,开始修改订单的支付方式和付款状态
/*$Apply=M('Apply');
$data['pay_state']=1;
$data['pay_type']='alipay';
$ret= $Apply->where(array('id'=>$out_trade_no))->save($data);
if($ret){
echo "success";
}*/
}
echo "success"; //请不要修改或删除
}
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else {
//验证失败
echo "fail".$_SESSION['master']['mas_id'];
//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
}
}
/******************************
服务器异步通知页面方法
其实这里就是将notify_url.php文件中的代码复制过来进行处理
*******************************/
public function notifyurl(){
vendor('Alipay.Corefunction');
vendor('Alipay.Md5function');
vendor('Alipay.Notify');
vendor('Alipay.Submit');
//这里我们通过TP的C函数把配置项参数读出,赋给$alipay_config;
$alipay_config = array(
'partner' => C('alipay_partner'), //这里是你在成功申请支付宝接口后获取到的PID;
'key' => C('alipay_key'),//这里是你在成功申请支付宝接口后获取到的Key
'private_key_path' => 'key/rsa_private_key.pem',
'ali_public_key_path' => 'key/alipay_public_key.pem',
'sign_type' => strtoupper('MD5'),
'input_charset' => 'utf-8',
'cacert' => getcwd().'\\cacert.pem',
'transport' => 'http',
);
//计算得出通知验证结果
$alipayNotify = new AlipayNotify($alipay_config);
$verify_result = $alipayNotify->verifyNotify();
if($verify_result) {
//验证成功
//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
$out_trade_no = $_POST['out_trade_no']; //商户订单号
$extra_common_param = $_POST['extra_common_param'];
$trade_no = $_POST['trade_no']; //支付宝交易号
$trade_status = $_POST['trade_status']; //交易状态
$total_fee = $_POST['total_fee']; //交易金额
$notify_id = $_POST['notify_id']; //通知校验ID。
$notify_time = $_POST['notify_time']; //通知的发送时间。格式为yyyy-MM-dd HH:mm:ss。
$buyer_email = $_POST['buyer_email']; //买家支付宝帐号;
$parameter = array(
"out_trade_no" => $out_trade_no, //商户订单编号;
"trade_no" => $trade_no, //支付宝交易号;
"total_fee" => $total_fee, //交易金额;
"trade_status" => $trade_status, //交易状态
"extra_common_param" => $extra_common_param,
"notify_id" => $notify_id, //通知校验ID。
"notify_time" => $notify_time, //通知的发送时间。
"buyer_email" => $buyer_email, //买家支付宝帐号;
);
if($_POST['trade_status'] == 'TRADE_FINISHED') {
}else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
//买家支付成功,开始修改订单的支付方式和付款状态
$Apply=M('Apply');
$data['pay_state']=1;
$data['pay_type']='alipay';
$ret= $Apply->where(array('id'=>$out_trade_no))->save($data);
if($ret){
echo "success";
}
}
echo "success"; //请不要修改或删除
}else {
//验证失败
echo "fail".$_SESSION['master']['mas_id'];
}
}
/*
页面跳转处理方法;
这里其实就是将return_url.php这个文件中的代码复制过来,进行处理;
*/
public function returnurl(){
vendor('Alipay.Corefunction');
vendor('Alipay.Md5function');
vendor('Alipay.Notify');
vendor('Alipay.Submit');
//这里我们通过TP的C函数把配置项参数读出,赋给$alipay_config;
$alipay_config = array(
'partner' => C('alipay_partner'), //这里是你在成功申请支付宝接口后获取到的PID;
'key' => C('alipay_key'),//这里是你在成功申请支付宝接口后获取到的Key
'private_key_path' => 'key/rsa_private_key.pem',
'ali_public_key_path' => 'key/alipay_public_key.pem',
'sign_type' => strtoupper('MD5'),
'input_charset' => 'utf-8',
'cacert' => getcwd().'\\cacert.pem',
'transport' => 'http',
);
$notify_url = C('site_url').'/index.php/Alipay/notifyurl'; //服务器异步通知页面路径
$return_url = C('site_url').U('User/order'); //页面跳转同步通知页面路径
$alipayNotify = new AlipayNotify($alipay_config);//计算得出通知验证结果
$verify_result = $alipayNotify->verifyReturn();
if($verify_result) {
//验证成功
if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
$this->success('支付成功',$return_url);
}else {
$this->error('支付失败,'.$_GET['trade_status'],$return_url);
}
}else {
//验证失败
//如要调试,请看alipay_notify.php页面的verifyReturn函数
$this->error('支付失败,'.$_GET['trade_status'],$return_url);
}
}
//空操作处理,所有空操作都指向空模块
public function _empty(){
$this->redirect('Empty/index');
}
}



目前有 0 条留言 其中:访客:0 条, 博主:0 条