0

私は 2 年間使用している php スクリプトを持っており、paypal が http 1.1 に変更されたときに機能するように変更しました。ほぼすべてのトランザクションで機能しましたが、最近失敗し、理由がわかりません。以下はコードです。

応答を見ようとすると失敗します。無効です

住所の非標準文字と何か関係があるのでしょうか?

IPNリクエストを何度も送信しようとしましたが、常に失敗します

function paypal_ipn() {
    $req = 'cmd=_notify-validate';

    foreach($_POST as $key => $value) {
        $value = urlencode(stripslashes($value));
        $req .= "&{$key}={$value}";
    }

    $res = '';
    $ch = curl_init(paypal_url());
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));   
    $res = curl_exec($ch);
    curl_close($ch);

    if(PAYPAL_IPN_DEBUG && !empty($_POST)) {
        $fname = 'ipn_intial_' . date('Y.m.d-h.i.s', time()) . '.txt';
        file_put_contents('log/' . $fname, $req);

        $fname = 'ipn_intial_result_' . date('Y.m.d-h.i.s', time()) . '.txt';
        file_put_contents('log/' . $fname, $res);

    }

    if(strcmp($res, "VERIFIED") == 0) {

        switch($_POST['txn_type']) 
{
        case 'web_accept':
            $data = array();
            $data['name'] = $_POST['first_name'] . ' ' . $_POST['last_name'];
            $data['email'] = $_POST['payer_email'];
            $data['txn_id'] = $_POST['txn_id'];
            $data['payment_status'] = 'Completed';
            $res = save_payment($data);
            if ($res) {
                $data = payment_details(array('txn_id' => $data['txn_id']));
                mail_notification($data);
            }            
            break;

        case 'subscr_signup':
            $params = array();
            $params['name'] = $_POST['first_name'] . ' ' . $_POST['last_name'];
            $params['email'] = $_POST['payer_email'];
            $params['subscr_id'] = $_POST['subscr_id'];
            $params['subscr_status'] = 'payment';

            $data = save_subscription($params);
            subscr_notification($data);
            break;
        case 'subscr_cancel':
            $data = subscr_details(array('subscr_id' => $_POST['subscr_id']));

            if ($data)
            {
                mysql_update('subscriptions', array('subscr_id' => $_POST['subscr_id']), array('subscr_status' => 'cancelled', 'cancel_date' => date('Y-m-d H:i:s')));
            }
            break;
        }

    }

    if(PAYPAL_IPN_DEBUG && !empty($_POST)) {
        $fname = 'ipn_' . date('Y.m.d-h.i.s', time()) . '.txt';
        file_put_contents('log/' . $fname, serialize($_POST));
    }
}
4

1 に答える 1

0

これはトリッキーでした。魔法の引用符がオフになっており、このスクリプトは魔法の引用符がオンになっていることを前提としています。したがって、呼び出す必要はありませんstripslashesこれがエラーの原因でした

于 2013-08-24T01:22:40.013 に答える