app支付,支付宝支付微信支付

<?php
/**
* app支付类服务端签名,以及验签
*/
namespace Mobile\Controller;

use Common\Controller\MobileframeController;
class PaysController extends MobileframeController
{
public function _initialize()
{
parent::_initialize();
}

/**
* 接受客户端参数,返回客服端签名后的数据
* 生成APP支付订单信息示例
*/
public function alipay(){
vendor('alipay.alipayapp.AopSdk');
$alipay_config = C('alipay_config'); //必须
$aop = new \AopClient();
$aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
$aop->appId = $alipay_config['app_id'];
$aop->rsaPrivateKey =$alipay_config['private_key'];
$aop->format = 'json';
$aop->postCharset = 'UTF-8';
$aop->signType = "RSA2";
$aop->alipayrsaPublicKey = $alipay_config['public_key'];
/**************************请求参数**************************/
//商户订单号,商户网站订单系统中唯一订单号,必填
$out_trade_no = $_POST['WIDout_trade_no'];

//订单名称,必填
$subject = $_POST['WIDsubject'];

//付款金额,必填
$total_fee = $_POST['WIDtotal_fee']/100;

//商品描述,可空
$body = $_POST['WIDbody'];


/************************************************************/
$bizcontent = json_encode([
'body' => $body,
'subject' => $subject,
'out_trade_no' => $out_trade_no,
'total_amount' => $total_fee,
'product_code' => 'QUICK_MSECURITY_PAY'
]);

$request = new \AlipayTradeAppPayRequest();
$notify_url = 'https://test.com/mobile/pays/alipay_notify';
$request->setNotifyUrl($notify_url);
$request->setBizContent($bizcontent);
//生成用于调用收银台SDK的字符串
$response = $aop->sdkExecute($request);

echo $response;

}

public function alipay_notify(){
vendor('alipay.alipayapp.AopSdk');
$alipay_config = C('alipay_config');
$aop = new \AopClient();
$aop->alipayrsaPublicKey = $alipay_config['public_key'];
// $ree = file_get_contents("php://input");
// sp_log($ree.'回调信息');
$flag = $aop->rsaCheckV1($_POST,NULL,"RSA2"); // 检验签名

if($flag) {//验证成功
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//请在这里加上商户的业务逻辑程序代
//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
//商户订单号
$out_trade_no = $_POST['out_trade_no'];
//支付宝交易号
$trade_no = $_POST['trade_no'];
//交易状态
$trade_status = $_POST['trade_status'];
// logResult($trade_status);
if($_POST['trade_status'] == 'TRADE_FINISHED') {
$res = $this->notice_order_status_change($out_trade_no);//更新订单函数
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序

//注意:
//该种交易状态只在两种情况下出现
//1、开通了普通即时到账,买家付款成功后。
//2、开通了高级即时到账,从该笔交易成功时间算起,过了签约时的可退款时限(如:三个月以内可退款、一年以内可退款等)后。

//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
}
else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
$res = $this->notice_order_status_change($out_trade_no);//更新订单函数


//注意:
//该种交易状态只在一种情况下出现——开通了高级即时到账,买家付款成功后。

//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
//判断该笔订单是否在商户网站中已经做过处理
}

//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
sp_log('success');
if($res){
echo "success";
}else{
echo "fail";
} //请不要修改或删除
// logResult("成功,商户订单号".$out_trade_no.",支付宝交易号:".$trade_no.",交易状态:".$trade_status);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else {
//验证失败
sp_log('fail');
echo "fail";

// logResult("失败");

//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
}
}

private function notice_order_status_change($out_trade_no,$type=1,$status=1){
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
sp_log($out_trade_no);
$orderstatus = M('order')->field('status')->where(array('orderid'=>$out_trade_no))->find();
if($orderstatus==1){
return true;
}
$res = M('order')
->where(array('orderid'=>$out_trade_no))
->save(array('utime'=>$this->ctime,'status'=>$status,'type'=>$type));
if(!$res){
return false;
}
$res = M('order')->field('id,oid,uid')->where(array('orderid'=>$out_trade_no))->find();
$goods = M('goods')->field('dtime,num')->where(array('id'=>$res['oid']))->find();
$dtime = date('Y-m-d H:i:s',time()+$goods['dtime']*24*60*60);
$data = array( 'orderid'=>$res['id'],
'oid'=>$res['oid'],
'uid'=>$res['uid'],
'num'=>$goods['num'],
'ctime'=>$this->ctime,
'utime'=>$this->ctime,
'etime'=>$dtime,
);
$bbuy = M('buy')->where(array('orderid'=>$res['id']))->find();
if(!$bbuy and $res and $goods){
$res = M('buy')->add($data);
}else{
return false;
}
return true;
}

/**
* 商户系统先调用该接口在微信支付服务后台生成预支付交易单
*/
public function wxpay(){
Vendor('WxpayAPI.example.native');
$indata = new \WxPayUnifiedOrder();
$indata->SetBody($_POST["name"]);//购买套餐名
$indata->SetOut_trade_no($_POST["orderid"]);//订单id
$indata->SetTotal_fee($_POST["price"]);//订单价格
$indata->SetNotify_url('https://test.com/user/order/weixin_return');//通知地址
$indata->SetTrade_type("APP");//交易类型
$order = \WxPayApi::unifiedOrder($indata);
$this->ajaxReturn($order);
}

//查询订单
function weixin_query(){
Vendor('WxpayAPI.example.orderquery');

if(isset($_REQUEST["out_trade_no"]) && $_REQUEST["out_trade_no"] != ""){
$out_trade_no = $_REQUEST["out_trade_no"];
$input = new \WxPayOrderQuery();
$input->SetOut_trade_no($out_trade_no);
$res = \WxPayApi::orderQuery($input);
$this->ajaxReturn($res);
}
}
//返回参数
public function wxpayparameter(){
Vendor('WxpayAPI.example.native');
$parameter['appid'] = \WxPayConfig::APPID;
$parameter['mchid'] = \WxPayConfig::MCHID;
$parameter['key'] = \WxPayConfig::KEY;
$parameter['appsecret'] = \WxPayConfig::APPSECRET;
$parameter['status'] = 1;
$this->ajaxReturn($parameter);
}
}
posted @ 2017-08-18 10:41  jackduan1  阅读(565)  评论(0编辑  收藏  举报