支付宝手机支付 接口
讲解:
一:取得 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'];?>" style="display:none"> <?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>
明天上返回的那个