講解:
一:取得 token
要取得 token 有兩個 參數是 是必須
req_data 和 sign
req_data格式如下(這是一些必填的。如果想要更多的參數自己去下載手冊):
<direct_trade_create_req> <notify_url>{通知地址}</notify_url> <call_back_url>{返回地址}</call_back_url> <seller_account_name>{商家支付寶賬號}</seller_account_name> <out_trade_no>{外部訂單號}</out_trade_no> <subject>{商品介紹}</subject> <total_fee>{商品價格}</total_fee> </direct_trade_create_req>
sign(簽名)格式如下
$params = array( /* 基本信息 */ 'partner' => {支付寶pid}, 'req_id' => md5({網站訂單號}), 'service' => 'alipay.wap.trade.create.direct', 'format' => 'xml', 'v' => '2.0', 'sec_id' => 'MD5', "_input_charset" => CHARSET "req_data" => {以面的req_data} ); if($sort){ /* 排序 */ ksort($params); reset($params); } $sign = ''; foreach ($params AS $key => $value) { $sign .= "{$key}={$value}&"; } md5(substr($sign, 0, -1) . {支付寶key});
sign 要注意的地方 是 排序 md5之前一定要按手冊上的排序不然會出錯的
然後以post方式提交給
http://wappaygw.alipay.com/service/rest.htm?
注意 返回的 數據是 經過 urlencode 的 所心我們要用 urldecode 解碼 然後還得用解析 返回的數據
/** * 解析遠程模擬提交後返回的信息 * @param $str_text 要解析的字符串 * @return 解析結果 */ function parseResponse($str_text) { //以“&”字符切割字符串 $para_split = explode('&',$str_text); //把切割後的字符串數組變成變量與數值組合的數組 foreach ($para_split as $item) { //獲得第一個=字符的位置 $nPos = strpos($item,'='); //獲得字符串長度 $nLen = strlen($item); //獲得變量名 $key = substr($item,0,$nPos); //獲得數值 $value = substr($item,$nPos+1,$nLen-$nPos-1); //放入數組中 $para_text[$key] = $value; } if( ! empty ($para_text['res_data'])) { //token從res_data中解析出來(也就是說res_data中已經包含token的內容) $doc = new DOMDocument(); $doc->loadXML($para_text['res_data']); $para_text['request_token'] = $doc->getElementsByTagName( "request_token" )->item(0)->nodeValue; } return $para_text; }
最後的 規范的支付表單數據 就是(這裡是要用get)
$params = array( 'partner' => $this->_config['wap_alipay_partner'], 'req_id' => md5({網站訂單號}), 'service' => 'alipay.wap.trade.create.direct', 'format' => 'xml', 'v' => '2.0', 'sec_id' => 'MD5', "_input_charset" => CHARSET 'req_data'=>'<auth_and_execute_req><request_token>' . {token} . '</request_token></auth_and_execute_req>', 'service' => "alipay.wap.auth.authAndExecute", ); //這個地方也要簽名的。方式和上面一樣 $params['sign'] = _get_sign($params); //get數據 $return = array( 'online' => {聯線}, 'desc' => {支付說明}, 'method' => 'GET', 'gateway' => 'http://wappaygw.alipay.com/service/rest.htm?', 'params' => $params, )
最後 跳轉到支付寶
<form action="<?php echo $return['gateway'];?>" id="payform" method="<?php echo $return['method'];?>" > <?php foreach ( $return['params'] $_k=>$value){?> <input type="hidden" name="<?php echo $_k;>" value="<?php echo $value;>" /> <?php }?> </form> <script type="text/javascript"> document.getElementById('payform').submit(); </script>
明天上返回的那個