1、支付宝支付
(1)前端表单
<form name=alipayment action="" method=post>
(2)创建订单
include_once(Yii::app()->basePath . '/extensions/alipay/alipay.config.php');
include_once(Yii::app()->basePath . "/extensions/alipay/lib/alipay_submit.class.php");
//构造要请求的参数数组,无需改动
$parameter = array(
"service" => $alipay_config['service'],
"partner" => $alipay_config['partner'],
"seller_id" => $alipay_config['seller_id'],
"payment_type" => $alipay_config['payment_type'],
"notify_url" => "http://xxx/Notify",
"return_url" => "http://xxx/Return",
"_input_charset" => trim(strtolower($alipay_config['input_charset'])),
"out_trade_no" => $sn,//唯一订单号
"subject" => $name,//商品标题
"total_fee" => $amount,//实付金额
"show_url" => $url,//支付完成后跳转地址
"app_pay" => $appPay,//启用此参数能唤起钱包APP支付宝
"body" => '',//订单描述
);
//建立请求
$alipaySubmit = new AlipaySubmit($alipay_config);
$returnStr = $alipaySubmit->buildRequestForm($parameter, "get", "确认");
echo $returnStr;
(3)异步通知
/*
* 支付宝异步通知
*/
public function actionNotify(){
include_once(Yii::app()->basePath.'/extensions/alipay/alipay.config.php');
include_once(Yii::app()->basePath."/extensions/alipay/lib/alipay_notify.class.php");
//计算得出通知验证结果
$alipayNotify = new AlipayNotify($alipay_config);
$verify_result = $alipayNotify->verifyNotify();
if($verify_result) {//验证成功
/
//请在这里加上商户的业务逻辑程序代
//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
//商户订单号
$out_trade_no = $_POST['out_trade_no'];
//支付宝交易号
$trade_no = $_POST['trade_no'];
//交易状态
$trade_status = $_POST['trade_status'];
//支付金额
$total_fee = $_POST['total_fee'];
//卖家支付宝账号
$seller_email = $_POST['seller_email'];
Yii::log(json_encode($_POST), 'alipay ___ success');
$echo = 'success';
if($trade_status == 'TRADE_FINISHED') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
//注意:
//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
//调试用,写文本函数记录程序运行情况是否正常
logResult("TRADE_FINISHED");
$orderInfo = SaleOrderInfo::model()->findByAttributes(array("sn" => $out_trade_no));
logResult(print_r($orderInfo,true));
if($orderInfo && ($seller_email == $alipay_config['alipayName'])) {
logResult("chu li ding dan 1");
$conn = SaleOrder::model()->getDbConnection();
$transaction = $conn->beginTransaction();
/*****这里写你的处理逻辑****/
if ($bool) {
$transaction->commit();
$echo = 'success';
} else {
$transaction->rollback();
$echo = 'fail1';
}
}
exit($echo);
}else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
//注意:
//付款完成后,支付宝系统发送该交易状态通知
//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
//调试用,写文本函数记录程序运行情况是否正常
logResult("TRADE_SUCCESS");
$orderInfo = SaleOrderInfo::model()->findByAttributes(array("sn" => $out_trade_no));
logResult(print_r($orderInfo,true));
if($orderInfo && ($seller_email == $alipay_config['alipayName'])) {
logResult("chu li ding dan 1");
/*****这里写你的处理逻辑****/
if ($bool) {
$transaction->commit();
$echo = 'success';
} else {
$transaction->rollback();
$echo = 'fail1';
}
}
exit($echo);
}
}
else {
//调试用,写文本函数记录程序运行情况是否正常
logResult("验证失败");
//验证失败
exit("fail");
}
}
(4)回调
public function actionReturn(){
include_once(Yii::app()->basePath.'/extensions/alipay/alipay.config.php');
include_once(Yii::app()->basePath."/extensions/alipay/lib/alipay_notify.class.php");
$alipayNotify = new 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['trade_status'];
//支付金额
$total_fee = $_GET['total_fee'];
//卖家支付宝账号
$seller_id = $_GET['seller_id'];
Yii::log(json_encode($_GET), '支付宝wap支付验证成功,订单号 '.$out_trade_no);
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
//注意:
//付款完成后,支付宝系统发送该交易状态通知
//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
//调试用,写文本函数记录程序运行情况是否正常
logResult('支付宝WAP同步跳转处理:');
logResult(print_r($_GET,true));
if($seller_id == $alipay_config['seller_id']) {
$conn = SaleOrder::model()->getDbConnection();
$transaction = $conn->beginTransaction();
/*****写你的处理逻辑*****/
}
}else{
logResult("支付宝WAP支付验证失败:".print_r($_GET,true));
exit;
}
}
2.微信支付
(1)创建订单
ini_set('date.timezone', 'PRC');//Asia/Shanghai
require_once Yii::app()->basePath.'/extensions/WxpayAPI/lib/WxPay.Api.php';
require_once Yii::app()->basePath.'/extensions/WxpayAPI/log.php';
//初始化日志
//以下临时注释
/* $logHandler= new CLogFileHandler(Yii::app()->basePath."/extensions/WxpayAPI/logs/".date('Y-m-d').'.log');
$log = Log::Init($logHandler, 15);*/
$input = new WxPayUnifiedOrder();
$input->SetBody("****");//订单描述
$input->SetAttach("微信h5支付");
$input->SetAppid('***');//appid
$input->SetMch_id('***');//mch_id
$input->SetOut_trade_no($sn);
$input->SetTotal_fee($amount*100);
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
//$input->SetGoods_tag("");
$input->SetNotify_url("http://****/WxNotify");//通知
$input->SetTrade_type("MWEB");
$str = "{\"h5_info\": {\"type\":\"Wap\",\"wap_url\": \"https://www.baidu.com\",\"wap_name\": \"购买***\"}}";
$input->SetScene_info($str);
$result = WxPayApi::unifiedOrder($input);
$url_encode_redirect_url = urlencode("*****");//支付完成后返回的地址
$url = $result['mweb_url'] . '&redirect_url=' . $url_encode_redirect_url;
(2)异步通知
require_once Yii::app()->basePath.'/extensions/WxpayAPI/lib/WxPay.Api.php';
require_once Yii::app()->basePath.'/extensions/WxpayAPI/lib/WxPay.Notify.php';
require_once Yii::app()->basePath.'/extensions/WxpayAPI/log.php';
require_once Yii::app()->basePath.'/extensions/WxpayAPI/lib/WxPay.Data.php';
require_once Yii::app()->basePath.'/extensions/WxpayAPI/lib/WxPay.Config.php';
public function actionWxNotify()
{
$notify = new WxPayNotifyReply();
//获取通知的数据
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
Log::DEBUG("微信支付通知:" . $xml);
//如果返回成功则验证签名
try {
$result = WxPayResults::Init($xml);
} catch (WxPayException $e){
$msg = $e->errorMessage();
$result = false;
}
if($result == false){
$notify->SetReturn_code("FAIL");
$notify->SetReturn_msg($msg);
Log::DEBUG($msg);
} else {//验证成功
Log::DEBUG("微信通知验证成功,内容为:".print_r($result,true));
$out_trade_no = $result['out_trade_no'];
$total_fee = $result['total_fee']/100;
$result_code = $result['result_code'];
$mch_id = $result['mch_id'];
if($result_code == 'SUCCESS'){
if($orderInfo){
Log::DEBUG("订单验证通过,开始处理订单:".$out_trade_no);
if ($orderFlag && $orderLogFlag && $orderInfoFlag) {
$transaction->commit();
$notify->SetReturn_code("SUCCESS");
$notify->SetReturn_msg("OK");
} else {
$transaction->rollback();
$notify->SetReturn_code("FAIL");
Log::DEBUG('订单处理失败:'.$out_trade_no);
}
// Yii::log("支付订单【{$e->getMessage()}】订单ID{$orderData->id}!\n", CLogger::LEVEL_ERROR);
// $notify->SetReturn_code("FAIL");
}else{//订单验证失败
Log::DEBUG('订单验证失败(‘不存在’或者 ‘信息异常’、‘已经处理过’)'.$out_trade_no);
$notify->SetReturn_code("FAIL");
}
}
}
//回复通知
if($result == true && $notify->GetReturn_code($return_code) == "SUCCESS")
{
$notify->SetSign();
}
WxpayApi::replyNotify($notify->ToXml());
Log::DEBUG("回复微信的通知为:".$notify->ToXml());
exit;
}