微信APP支付,支付寶APP支付demo


最近公司新開發的APP中,需要集成微信支付和支付寶支付,2個平台申請的都是APP支付。這是個人第一次單獨的,完整的做完2個平台的支付。

這里我主要用到了2個接口:支付接口,訂單查詢接口,雖然2個平台的文檔都挺齊全,但開發下來,還是踩了不少坑,記錄下來,或許對后來人有用。

先來說支付寶SDK:

  了解3個概念:應用公鑰,應用私鑰和支付寶公鑰

  開發人員用支付寶提供的秘鑰生成工具生成的秘鑰,即為應用公鑰和應用私鑰。

  開發人員在給支付寶APP配置應用公鑰后,支付寶主動生成了一個公鑰,即為支付寶公鑰。

  配置如下圖示:

       

  需要把這個支付寶公鑰保存下來,具體使用場景,請看后續說明。

  這里個人用到了2個接口,生成支付訂單信息和訂單查詢。

  支付寶提供了服務端SDK的下載:https://docs.open.alipay.com/54/106370/

  其目錄顯示:

  

  下面直接給出支付、回調、訂單查詢的代碼:

// 生成支付信息
function pay() {
$aop = new AopClient;
$aop->gatewayUrl = '網關地址';
$aop->appId = 'alipay_appid';
$aop->rsaPrivateKey = '應用私鑰';
$aop->signType = "RSA2";
$aop->alipayrsaPublicKey = '支付寶公鑰';

$request = new AlipayTradeAppPayRequest();

$bizcontent = "{\"body\":\"賬戶充值\","
. "\"subject\": \"用戶賬戶充值\","
. "\"out_trade_no\": \"訂單號\","
. "\"timeout_express\": \"30m\","
. "\"total_amount\": \"訂單金額\","
. "\"product_code\":\"QUICK_MSECURITY_PAY\""
. "}";
$request->setNotifyUrl('開發者回調地址');
$request->setBizContent($bizcontent);
$response = $aop->sdkExecute($request);

// 注意: 官方demo里,這里加了htmlspecialchars方法,其實是錯誤的,應該去掉,否則會報ALI38173錯誤
echo $response;
}

// 回調
function callback() {
$aop = new AopClient ();
$aop->alipayrsaPublicKey = '支付寶公鑰';

// 支付寶回調是以POST方式提交過來的
$result = $aop->rsaCheckV1($_POST, null, $_POST['sign_type']);

if ($result) {
// TODO 驗證訂單號,支付金額,支付寶狀態等信息
echo 'success';
} else {
echo 'error';
}
}

// 訂單查詢
function queryOrder() {
$aop = new AopClient ();
$aop->signType = "RSA2";
$aop->gatewayUrl = '網關地址';
$aop->appId = 'appid';
$aop->rsaPrivateKey = '應用私鑰';

// 注意:這里是支付寶公鑰,不是應用公鑰
$aop->alipayrsaPublicKey = '支付寶公鑰';

$request = new AlipayTradeQueryRequest ();
$request->setBizContent("{" .
"\"out_trade_no\":\"訂單號\"," .
"\"trade_no\":\"交易單號\"" .
"}");
$result = $aop->execute($request);

$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;

if(! empty($resultCode) && $resultCode == 10000) {
if ($result->$responseNode->trade_status == 'TRADE_SUCCESS') {
// 支付成功, 更新訂單狀態,用戶賬戶余額,賬戶變化日志
}
}
}

 

微信支付:

  在開發平台申請app支付:https://open.weixin.qq.com/

  審核通過后,需要配置開發信息

  

  服務端PHP的demo:

// 生成支付信息
function pay() {
    $input = new WxPayUnifiedOrder();
    $input->SetBody('支付標題');
    $input->SetAttach('附加信息'); //  附加信息
    $input->SetOut_trade_no('訂單號');
    $input->SetTotal_fee('訂單金額,單位分'); //微信支付,單位(分)
    $input->SetTime_start(date("YmdHis"));
    $input->SetTime_expire(date("YmdHis", time() + 600));
    $input->SetGoods_tag('附屬信息');
    $input->SetNotify_url('回調地址');
    $input->SetTrade_type("APP");

    // 生成預支付訂單ID:prepay_id
    $unifiedOrder = WxPayApi::unifiedOrder($input);

    // 生成簽名,返回給APP前端調用
    $result = makeWxPaySign($unifiedOrder);
}

// 生成簽名
function makeWxPaySign($UnifiedOrderResult)
{
    if(! array_key_exists("appid", $UnifiedOrderResult)
        || ! array_key_exists("prepay_id", $UnifiedOrderResult)
        || empty($UnifiedOrderResult['prepay_id']))
    {
        throw new WxPayException("參數錯誤");
    }

    $api = new WxPayAppPay();
    $api->SetValue('appid', $UnifiedOrderResult["appid"]);
    $api->SetValue('package', "Sign=WXPay");
    $api->SetValue('prepayid', $UnifiedOrderResult['prepay_id']); // 預支付訂單號
    $api->SetValue('partnerid', WxPayConfig::MCHID); // 商戶號
    $api->SetValue('noncestr', WxPayApi::getNonceStr()); // 隨機數
    $api->SetValue('timestamp', (string)time());

    // 對上面參數進行簽名
    $api->SetValue('sign', $api->MakeSign());

    return $api->GetValues();
}

// 回調,繼承微信SDK的回調類
class PayNotifyCallBack extends WxPayNotify
{
    //重寫回調處理函數
    public function NotifyProcess($data, &$msg)
    {
        if (! array_key_exists("transaction_id", $data)) {
            return false;
        }

        // 調用訂單查詢方法,判斷訂單真實性

        return true;
    }
}


// 訂單查詢
function queryOrder() {
    $input = new WxPayOrderQuery();

    $input->SetTransaction_id('支付平台交易號');
    $input->SetOut_trade_no('公司平台單號');

    // 訂單查詢結果
    $result = WxPayApi::orderQuery($input);

    if(array_key_exists("return_code", $result)
        && array_key_exists("result_code", $result)
        && array_key_exists('trade_state', $result)
        && $result["return_code"] == "SUCCESS"
        && $result["result_code"] == "SUCCESS"
        && $result["trade_state"] == "SUCCESS")
    {
        // 交易成功,todo 更新訂單狀態,用戶賬戶余額,賬戶變化日志
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM