1.在支付宝开放平台创建一个应用(https://openhome.alipay.com/platform/appCreate.htm) (手机网站支付), 创建成功后,从应用列表进入应用详情,为该应用添加手机网站支付功能,既申请该接口,在申请过程中需要提供你系统的url,请确认此url外网可以访问到,然后在应用中配置回调url(异步回调与同步回调:注意,请确认异步回调外网可以直接访问到且在异步回调的方法中请不要有输出或者是任何验证等阻止页面加载的代码,包括session与cookie)和通知url 。
2.下载sdk,
参考支付宝开发文档/手机网站支付/快速接入/使用SDK快速接入这个文档里面微信公众平台无法使用支付宝收付款解决方案所述来实现,基于这个的。里面有demo,我就是下载的这个来实现的。
另外的demo下载,点击这里查看,需要调用支付宝接口,主要使用解压文件中的 demo_get.htm、pay.htm、ap.js;
3.将下载文件解压。
4.走自己公众号的流程,进入选择支付方式界面,就是一个简单的选择微信支付还是支付宝支付页面;
5.订单处理代码
$code = I('code'); $params = I(); $wxpay = new Wxpay(C('WX.appid'), C('WX.secret'), C('WX.mchid'), C('WX.key')); if (!$code) { $url = $wxpay->getOauthUrl(); $state = json_encode($params,JSON_UNESCAPED_UNICODE);//中文错误处理 $url = str_replace("STATE", $state, $url);//回调丢失订单信息处理 header("Location: {$url}"); exit(); } else { $wx_user = $wxpay->getUserInfo($code); $openid = $wx_user['openid']; } //此处之前是获取用户openid的回调方法,用不到可以直接忽略, $state = $_GET['state']; $state = str_replace("\\", "", $state); $params = json_decode($state, true);;//请求参数 $params['openid'] = $openid; $params['nickname'] = $wx_user['nickname']; $params['headimgurl'] = $wx_user['headimgurl']; $params['city'] = $wx_user['city']; $params['province'] = $wx_user['province']; $params['sex'] = $wx_user['sex']; //获取支付方式 $pay_type = $params['zftype'];//微信支付 或者支付宝支付 $pay_behavior = $params['customerBehavior'];//根据页面信息跳转指定方法 unset($params['zftype']); $params = urlencode(serialize($params)); //判断支付方式 if($pay_type == 'alipay'){ $url = U('alipay',array('param'=>$params),true,true); header("Location: {$url}"); die; }elseif($pay_type == 'wxpay'){ session('paramali',$params); $this->redirect($pay_behavior); die; }
6.将下载的sdk放入tp框架的渲染组件中(就是保证能引入使用就行
vendor('alipay.wappay.service.AlipayTradeService'); vendor('alipay.wappay.buildermodel.AlipayTradeWapPayContentBuilder'); $config = C('Alipay');
)创建支付宝订单信息,代码如下
$timeout_express="1m"; //构造支付宝链接 $payRequestBuilder = new \AlipayTradeWapPayContentBuilder(); $payRequestBuilder->setBody($body); $payRequestBuilder->setSubject($subject); $payRequestBuilder->setOutTradeNo($out_trade_no); $payRequestBuilder->setTotalAmount($total_amount); $payRequestBuilder->setTimeExpress($timeout_express); $payRequestBuilder->setQuitUrl($config['quit_url']); $payRequestBuilder->getBizContent(); session('out_trade_no',$out_trade_no); cookie('out_trade_no',$out_trade_no); $payRequestBuilder = $payRequestBuilder; $payResponse = new \AlipayTradeService($config); //此处$result才是重点,所有的努力都是为了这个连接 $result=$payResponse->wapPay($payRequestBuilder,$config['return_url'],$config['notify_url']);
(在后期调试的时候可以打印这个$result查看请求参数是否正确 (注意!调用支付宝接口的时候相关类中构造请求路径或参数的时候有两种方式,GET和POST,post是form表单,这里选择GET方式拿到构造的URL!),注意更改下载文件AlipayTradeservice.php中的
function aopclientRequestExecute($request,$ispage=false) { $aop = new AopClient (); $aop->gatewayUrl = $this->gateway_url; $aop->appId = $this->appid; $aop->rsaPrivateKey = $this->private_key; $aop->alipayrsaPublicKey = $this->alipay_public_key; $aop->apiVersion ="1.0"; $aop->postCharset = $this->charset; $aop->format= $this->format; $aop->signType=$this->signtype; // 开启页面信息输出 $aop->debugInfo=true; if($ispage) { $result = $aop->pageExecute($request,"GET"); } else { $result = $aop->Execute($request); } //打开后,将报文写入log文件 $this->writeLog("response: ".var_export($result,true)); return $result; }
将这个方法中的$result = $aop=>pageExecute($request,'POST')改为$result = $aop=>pageExecute($request,'GET')),将这个地址赋值到下载的demo_get.htm(主要使用里面的代码,文件后缀名可以更改), 把demo里面a标签中href中的demo链接替换成调用支付宝得到的请求链接,引入ap.js。点击确认支付的时候会执行下面的js代码中_AP.pay代码调用ap.js中的pay的location.href路径,同时会get传递一个参数goto: 此时传递参数跳入另外一个html就是pay.html了 ;
7.引导用户浏览器打开页面,搞定;
public function pay(){ $goto = I('goto'); $goto = $goto; $this->assign('goto',$goto); $this->display(); }