mytharcher\sdk\alipay\Alipay::prepareMobileTradeData PHP Method

prepareMobileTradeData() public method

移动网页支付接口不同,需要先服务器提交一次请求,拿到返回 token 再返回客户端发起真实支付请求。 该方法只完成第一次服务端请求,生成参数后需要客户端另行处理(可调用buildRequestFormHTML生成表单提交)。
public prepareMobileTradeData ( $params ) : /
$params $params['out_trade_no'] 订单唯一编号 $params['subject'] 商品标题 $params['total_fee'] 支付总费用 $params['merchant_url'] 商品链接地址 $params['req_id'] 请求唯一 ID $params['it_b_pay'] 超期时间(秒)
return /
    function prepareMobileTradeData($params)
    {
        // 不要用 SimpleXML 来构建 xml 结构,因为有第一行文档申明支付宝验证不通过
        $xml_str = '<direct_trade_create_req>' . '<notify_url>' . $this->config['notify_url'] . '</notify_url>' . '<call_back_url>' . $this->config['return_url'] . '</call_back_url>' . '<seller_account_name>' . $this->config['seller_email'] . '</seller_account_name>' . '<out_trade_no>' . $params['out_trade_no'] . '</out_trade_no>' . '<subject>' . htmlspecialchars($params['subject'], ENT_XML1, 'UTF-8') . '</subject>' . '<total_fee>' . $params['total_fee'] . '</total_fee>' . '<merchant_url>' . $params['merchant_url'] . '</merchant_url>' . (isset($params['it_b_pay']) ? '<pay_expire>' . $params['it_b_pay'] . '</pay_expire>' : '') . '</direct_trade_create_req>';
        $request_data = $this->buildSignedParameters(array('service' => $this->service, 'partner' => $this->config['partner'], 'sec_id' => $this->config['sign_type'], 'format' => 'xml', 'v' => '2.0', 'req_id' => $params['req_id'], 'req_data' => $xml_str));
        $url = $this->gateway;
        $input_charset = trim(strtolower($this->config['input_charset']));
        if (trim($input_charset) != '') {
            $url = $url . "_input_charset=" . $input_charset;
        }
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
        //SSL证书认证
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
        //严格认证
        curl_setopt($curl, CURLOPT_CAINFO, $this->config['cacert']);
        //证书地址
        curl_setopt($curl, CURLOPT_HEADER, 0);
        // 过滤HTTP头
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        // 显示输出结果
        curl_setopt($curl, CURLOPT_POST, true);
        // post传输数据
        curl_setopt($curl, CURLOPT_POSTFIELDS, $request_data);
        // post传输数据
        $responseText = curl_exec($curl);
        //var_dump( curl_error($curl) );//如果执行curl过程中出现异常,可打开此开关,以便查看异常内容
        curl_close($curl);
        if (empty($responseText)) {
            return NULL;
        }
        parse_str($responseText, $responseData);
        if (empty($responseData['res_data'])) {
            return NULL;
        }
        if ($this->config['sign_type'] == '0001') {
            $responseData['res_data'] = $this->rsaDecrypt($responseData['res_data'], $this->config['private_key_path']);
        }
        //token从res_data中解析出来(也就是说res_data中已经包含token的内容)
        $doc = new \DOMDocument();
        $doc->loadXML($responseData['res_data']);
        $responseData['request_token'] = $doc->getElementsByTagName("request_token")->item(0)->nodeValue;
        $xml_str = '<auth_and_execute_req>' . '<request_token>' . $responseData['request_token'] . '</request_token>' . '</auth_and_execute_req>';
        return array('service' => self::SERVICE_WAP_AUTH, 'partner' => $this->config['partner'], 'sec_id' => $this->config['sign_type'], 'format' => 'xml', 'v' => '2.0', 'req_data' => $xml_str);
    }