支付开发填坑记之支付宝

主要针对在App应用和网页版的支付功能(支付宝 , 微信 , 银联)开发时 , 所遇到的坑 。能填则填 。
支付宝在所有支付方式中最好开发的了 , 因为文档比较清晰 , 而且开发起来也比较简单 。因此 , 支付宝的坑是相对较少的 。
APP支付APP支付步骤为:

  1. 获取支付宝的配置信息 。
  2. 生成商家订单信息 。
  3. 根据订单信息生成待校验数据 。
  4. 生成请求给支付宝的加密字符串 。
  5. 将待校验数据和加密字符串拼接 , 返回给APP 。
  6. APP将得到的数据请求支付宝客户端进行支付 。
由于APP支付是由APP去调起支付宝支付 , 所以服务端需要做的事情就是将请求参数封装好之后返回APP即可 。
  1. 获取支付宝的配置信息 。
  2. 支付时需要的配置信息有:
  • key: 交易安全校验码 。
  • app_id:支付宝分配给开发者的应用ID 。
  1. 生成商家订单信息 。
  2. 这个步骤由商家自行生成 。支付宝那边只需要知道的订单信息为:
  • subject: 必填 。商品的标题/交易标题/订单标题/订单关键字等 。
  • total_amount: 必填 。订单价格 。
  • out_trade_no: 必填 。商户网站唯一订单号 。
  • body: 非必填 。交易的具体描述信息 。
  1. 根据订单信息生成待校验数据 。
  2. APP支付的详细请求参数: 点击查看
生成请求给支付宝的加密字符串 。
$sign = $alipaySubmit->buildRequestParaForApp($para_token);
  1. 其中 ,  buildRequestParaForApp 的实现为:
  2. 对待签名参数数组排序
/** * 对数组排序 * @param $para 排序前的数组 * return 排序后的数组 */function argSort($para) { ksort($para); reset($para); return $para;}生成签名结果(阿里推荐的是RSA2的签名方式 , 这里项目用的是RSA)
/** * RSA签名 * @param $data 待签名数据 * @param $private_key_path 商户私钥文件路径 * return 签名结果 */function rsaSign($data, $private_key_path) { $priKey = file_get_contents($private_key_path); $res = openssl_get_privatekey($priKey); openssl_sign($data, $sign, $res); openssl_free_key($res); //base64编码 $sign = base64_encode($sign); return $sign;}将待校验数据和加密字符串拼接 , 返回给APP 。
$url = "";foreach ($para_token as $key => $value) { $url .= $key."=".urlencode($value)."&";}return $url."sign=".urlencode($sign);
  1. APP将得到的数据请求支付宝客户端进行支付 。
  2. APP端将拼接好的字符串拿去请求支付宝客户端即可调起支付宝进行支付 。拼接好的字符串大致如下图所示:
网页版支付网页版支付步骤为:
  1. 设置支付宝的配置信息 。
  2. 向支付宝申请新订单 , 获取支付token 。
  3. 携带token进行订单支付 。
网页版的支付宝支付相对于APP调起支付宝要复杂 , 因为网页支付时 , 需要多次请求支付宝服务器获取支付的必要参数 。
  1. 设置支付宝配置信息 。
/**调用授权接口alipay.wap.trade.create.direct获取授权码token**///返回格式 private $format = ""; //必填 , 不需要修改//版本 private $v = ""; //必填 , 不需要修改//请求号 private $req_id = ""; //必填 , 须保证每次请求都是唯一//**req_data详细信息**//服务器异步通知页面路径 private $notify_url = ""; //需http://格式的完整路径 , 不允许加?id=123这类自定义参数//页面跳转同步通知页面路径 private $call_back_url = ""; //需http://格式的完整路径 , 不允许加?id=123这类自定义参数//卖家支付宝账户 private $seller_email = ""; //必填//商户订单号 private $out_trade_no = ""; //商户网站订单系统中唯一订单号 , 必填//订单名称 private $subject = ""; //必填//付款金额 private $total_fee = ""; //必填//请求业务参数详细 private $req_data = https://www.isolves.com/it/cxkf/bk/2019-09-19/""; //必填//配置 private $alipay_config = array(); /************************************************************/向支付宝申请新订单 , 并获取订单的token 。
1.请求token的service为: alipay.wap.trade.create.direct 。
2.构造参数:
$para_token = array( "service" => "alipay.wap.trade.create.direct", // 合作者身份(partner ID) "partner" => trim($this->alipay_config['partner']), // APP使用的是RSA , 网页版使用的是MD5 "sec_id" => trim($this->alipay_config['sign_type']), // 返回的数据格式 "format" => $this->format, // 版本号? "v" => $this->v, // 唯一的请求号 "req_id" => $this->req_id, // 请求参数 "req_data" => $req_data, // 字符集 , 一般为utf8即可 。"_input_charset" => trim(strtolower($this->alipay_config['input_charset'])));


推荐阅读