1. 程式人生 > >支付寶APP支付 統一下單 php服務端 tp5

支付寶APP支付 統一下單 php服務端 tp5


/*支付寶第三方支付

*
*生成APP支付訂單資訊
* @param number  uid 使用者id
* @param string   token 使用者token
* @param number  oid 訂單id
* @param string   title 標題
* @param string    body 商品描述
* @parma float    money 金額
* @param number ordernum 訂單編號

*/
    支付包官方文件   https://docs.open.aliyun.com/54/106370/
    public function zfb_pay()
    {
$data = input('post.');

Loader::import('/alipay/aop/AopClient',EXTEND_PATH);
$aop = new \AopClient();
$aop->appId = config("alipay_app_id");
$aop->rsaPrivateKey = config('alipay_private_key');

$aop->alipayrsaPublicKey = config('alipay_public_key');//對應填寫
$aop->signType = "RSA2";
//例項化具體API對應的request類,類名稱和介面名稱對應,當前呼叫介面名稱:alipay.trade.app.pay
Loader::import('/alipay/aop/request/AlipayTradeAppPayRequest',EXTEND_PATH);
$request = new \AlipayTradeAppPayRequest();

//SDK已經封裝掉了公共引數,這裡只需要傳入業務引數
$bizcontent = json_encode(array(
'body' => $data['body'], //商品描述
'subject' => $data['title'], //支付的標題,
'out_trade_no' => $data['ordernum'], //支付寶訂單號必須是唯一的,只能生成一次
'total_amount' => $data['money'], //金額
"timeout_express" => "30m", //訂單支付有效時間 m分鐘 h小時
'product_code' => 'QUICK_MSECURITY_PAY'
));
$request->setNotifyUrl("http://tapi.zuozuobang.com/notifyurl");//你在應用那裡設定的非同步回撥地址
$request->setBizContent($bizcontent);
//這裡和普通的介面呼叫不同,使用的是sdkExecute
$response = $aop->sdkExecute($request);
//htmlspecialchars是為了輸出到頁面時防止被瀏覽器將關鍵引數html轉義,實際列印到日誌以及http傳輸不會有這個問題
/* echo htmlspecialchars($response);*///就是orderString 可以直接給客戶端請求,無需再做處理。
if($response){
return_msg('200','支付寶請求成功!',$response);
}else{
return_msg('100','支付請求失敗!',$response);
}
}

/*
* 支付寶支付回撥
*/
public function notifyurl()
{

Loader::import('/alipay/aop/AopClient',EXTEND_PATH);
$aop = new \AopClient();
$aop->alipayrsaPublicKey =config('alipay_public_key');//對應填寫
$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']; //交易狀態trade_status
$total_amount = $_POST['total_amount']; //訂單的實際金額
$order = Db::table("shfw_order")->where('ordernum', $out_trade_no)->find();
if ($order) {
//只有交易通知狀態為TRADE_SUCCESS或TRADE_FINISHED時,支付寶才會認定為買家付款成功。
if ($trade_status != 'TRADE_FINISHED' && $trade_status != 'TRADE_SUCCESS') {
return 'fail';
}
//2、判斷total_amount是否確實為該訂單的實際金額(即商戶訂單建立時的金額);
if ($total_amount != $order['money']) {
return 'fail';
}
//校驗成功後在response中返回success,校驗失敗返回failure
$update = array(
'status' => '2', //修改支付狀態
'zhi_time' => time(), //新增支付時間
'pay_type' => 1); //新增支付型別
$result = Db::table("shfw_order")->where('ordernum', $out_trade_no)->update($update);
$res = Db::table("shfw_order")->where('ordernum', $out_trade_no)->field('id,mid,ordernum,nickname,addtime,pay_type')->find();
// $member = Db::table('shfw_member')->where('id',$res['mid'])->find();
//新增充值記錄
$res['payorder'] = $trade_no;
$res['money'] = $total_amount;
$addpay = $this->addpay($res);
if ($result && $addpay) {
return "success";
} else {
return 'fail';
}
} else {
exit('fail');
}
}
}