关于移动端的支付我们可以去看一下官方文档(传送门)
看过之后,我们使用官方的提供的demo进行测试,是没有问题的,但是官方提供的SDK包含的文件非常的多,于是就有了合成精简版
,该代码来自网络,我进行了部分修改(一点点哈哈哈
付款界面 当然了这个是沙箱 hahh
简要说明
其中$_GET['quit_url']
是当支付完成时候点击完成
或退回
时,回跳的地址,有人说$returnUrl
不就行了…hahah,其实这个也可以的,但是对于H5来说就不怎么友好了(跳回来的时候带了一大堆参数)….
就是支付成功之后点击完成跳回的页面
还有一个地方要注意的是下面这段代码,如果使用正式支付的话记得将网关地址改为正式
的地址,演示的为沙箱
的地址,此处根据需求自行更改
public function __construct() { $this->charset = 'utf-8'; $this->gatewayUrl = 'https://openapi.alipaydev.com/gateway.do'; // 网关地址 沙箱与正式的不同 请区分填写 }
哦哦哦,对了没有写回调文件,这个自己写一下就完事了,这里就不贴代码了
代码
<?php header('Content-type:text/html; Charset=utf-8'); /*** 请填写以下配置信息 ***/ $appid = '8888888'; //https://open.alipay.com 账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID $returnUrl = ''; //付款成功后的同步回调地址 这个为空就行 $notifyUrl = 'http://xzhiyu.cn/mapi/alipay.php'; //付款成功后的异步回调地址 $outTradeNo = $_GET['out_trade_no']; //你自己的商品订单号 $payAmount = $_GET['total_amount']; //付款金额,单位:元 $orderName = $_GET['body']; //订单标题 $quitUrl = $_GET['quit_url']; $signType = 'RSA2'; //签名算法类型,支持RSA2和RSA,推荐使用RSA2 $rsaPrivateKey = ''; //商户私钥,填写对应签名算法类型的私钥,如何生成密钥参考:https://docs.open.alipay.com/291/105971和https://docs.open.alipay.com/200/105310 /*** 配置结束 ***/ $aliPay = new AlipayService(); $aliPay->setAppid($appid); $aliPay->setReturnUrl($returnUrl); $aliPay->setNotifyUrl($notifyUrl); $aliPay->setRsaPrivateKey($rsaPrivateKey); $aliPay->setTotalFee($payAmount); $aliPay->setOutTradeNo($outTradeNo); $aliPay->setOrderName($orderName); $aliPay->setQuitUrl($quitUrl); $sHtml = $aliPay->doPay(); echo $sHtml; class AlipayService { protected $appId; protected $charset; protected $returnUrl; protected $notifyUrl; //私钥值 protected $rsaPrivateKey; protected $totalFee; protected $outTradeNo; protected $orderName; protected $quitUrl; public function __construct() { $this->charset = 'utf-8'; $this->gatewayUrl = 'https://openapi.alipaydev.com/gateway.do'; // 网关地址 沙箱与正式的不同 请区分填写 } public function setAppid($appid) { $this->appId = $appid; } public function setReturnUrl($returnUrl) { $this->returnUrl = $returnUrl; } public function setNotifyUrl($notifyUrl) { $this->notifyUrl = $notifyUrl; } public function setRsaPrivateKey($rsaPrivateKey) { $this->rsaPrivateKey = $rsaPrivateKey; } public function setTotalFee($payAmount) { $this->totalFee = $payAmount; } public function setOutTradeNo($outTradeNo) { $this->outTradeNo = $outTradeNo; } public function setOrderName($orderName) { $this->orderName = $orderName; } public function setQuitUrl($quitUrl) { $this->quitUrl = $quitUrl; } /** * 发起订单 * @return array */ public function doPay() { //请求参数 $requestConfigs = array( 'out_trade_no' => $this->outTradeNo, 'product_code' => 'QUICK_WAP_WAY', 'total_amount' => $this->totalFee, //单位 元 'subject' => $this->orderName, //订单标题 'quit_url' => $this->quitUrl, // 支付中断跳转 ); $commonConfigs = array( //公共参数 'app_id' => $this->appId, 'method' => 'alipay.trade.wap.pay', //接口名称 'format' => 'JSON', 'return_url' => $this->returnUrl, 'charset' => $this->charset, 'sign_type' => 'RSA2', 'timestamp' => date('Y-m-d H:i:s'), 'version' => '1.0', 'notify_url' => $this->notifyUrl, 'biz_content' => json_encode($requestConfigs), ); $commonConfigs["sign"] = $this->generateSign($commonConfigs, $commonConfigs['sign_type']); return $this->buildRequestForm($commonConfigs); } /** * 建立请求,以表单HTML形式构造(默认) * @param $para_temp 请求参数数组 * @return 提交表单HTML文本 */ protected function buildRequestForm($para_temp) { $sHtml = "<form id='alipaysubmit' name='alipaysubmit' action='" . $this->gatewayUrl . "?charset=" . $this->charset . "' method='POST'>"; foreach ($para_temp as $key => $val) { if (false === $this->checkEmpty($val)) { $val = str_replace("'", "'", $val); $sHtml .= "<input type='hidden' name='" . $key . "' value='" . $val . "'/>"; } } //submit按钮控件请不要含有name属性 $sHtml = $sHtml . "<input type='submit' value='ok' style='display:none;''></form>"; $sHtml = $sHtml . "<script>document.forms['alipaysubmit'].submit();</script>"; return $sHtml; } public function generateSign($params, $signType = "RSA") { return $this->sign($this->getSignContent($params), $signType); } protected function sign($data, $signType = "RSA") { $priKey = $this->rsaPrivateKey; $res = "-----BEGIN RSA PRIVATE KEY-----\n" . wordwrap($priKey, 64, "\n", true) . "\n-----END RSA PRIVATE KEY-----"; ($res) or die('您使用的私钥格式错误,请检查RSA私钥配置'); if ("RSA2" == $signType) { openssl_sign($data, $sign, $res, version_compare(PHP_VERSION, '5.4.0', '<') ? SHA256 : OPENSSL_ALGO_SHA256); //OPENSSL_ALGO_SHA256是php5.4.8以上版本才支持 } else { openssl_sign($data, $sign, $res); } $sign = base64_encode($sign); return $sign; } /** * 校验$value是否非空 * if not set ,return true; * if is null , return true; **/ protected function checkEmpty($value) { if (!isset($value)) { return true; } if ($value === null) { return true; } if (trim($value) === "") { return true; } return false; } public function getSignContent($params) { ksort($params); $stringToBeSigned = ""; $i = 0; foreach ($params as $k => $v) { if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) { // 转换成目标字符集 $v = $this->characet($v, $this->charset); if ($i == 0) { $stringToBeSigned .= "$k" . "=" . "$v"; } else { $stringToBeSigned .= "&" . "$k" . "=" . "$v"; } $i++; } } unset($k, $v); return $stringToBeSigned; } /** * 转换字符集编码 * @param $data * @param $targetCharset * @return string */ public function characet($data, $targetCharset) { if (!empty($data)) { $fileType = $this->charset; if (strcasecmp($fileType, $targetCharset) != 0) { $data = mb_convert_encoding($data, $targetCharset, $fileType); //$data = iconv($fileType, $targetCharset.'//IGNORE', $data); } } return $data; } }