AlipaySubmit.class.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. <?php
  2. /**
  3. * AlipaySubmit.class.php UTF-8
  4. * 功能:支付宝各接口请求提交类
  5. * 详细:构造支付宝各接口表单HTML文本,获取远程HTTP数据
  6. * 版本:3.3
  7. * 日期:2012-07-23
  8. * 说明:
  9. * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
  10. * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
  11. *
  12. * @date : 2018/5/2 12:10
  13. *
  14. * @license 这不是一个自由软件,未经授权不许任何使用和传播。
  15. * @author : wuyonghong <wyh@huosdk.com>
  16. * @version : HUOSDK 8.0
  17. */
  18. require_once("alipay_core.function.php");
  19. require_once("alipay_md5.function.php");
  20. require_once("alipay_rsa.function.php");
  21. class AlipaySubmit {
  22. var $alipay_config;
  23. /**
  24. *支付宝网关地址(新)
  25. */
  26. var $alipay_gateway_new = 'https://mapi.alipay.com/gateway.do?';
  27. function __construct($alipay_config) {
  28. $this->alipay_config = $alipay_config;
  29. }
  30. function AlipaySubmit($alipay_config) {
  31. $this->__construct($alipay_config);
  32. }
  33. /**
  34. * 生成签名结果
  35. *
  36. * @param array $para_sort 已排序要签名的数组
  37. *
  38. * @return bool|string false 签名失败 string 签名结果字符串
  39. */
  40. function buildRequestMysign($para_sort) {
  41. //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
  42. $prestr = createLinkString($para_sort);
  43. switch (strtoupper(trim($this->alipay_config['sign_type']))) {
  44. case "MD5" :
  45. $_my_sign = md5Sign($prestr, $this->alipay_config['key']);
  46. break;
  47. case "RSA" :
  48. $_my_sign = rsaSign($prestr, $this->alipay_config['private_key_path']);
  49. break;
  50. default :
  51. $_my_sign = "";
  52. }
  53. return $_my_sign;
  54. }
  55. /**
  56. * 生成要请求给支付宝的参数数组
  57. *
  58. * @param array $para_temp 请求前的参数数组
  59. *
  60. * @return array 要请求的参数数组
  61. */
  62. function buildRequestPara($para_temp) {
  63. //除去待签名参数数组中的空值和签名参数
  64. $para_filter = paraFilter($para_temp);
  65. //对待签名参数数组排序
  66. $para_sort = argSort($para_filter);
  67. //生成签名结果
  68. $_my_sign = $this->buildRequestMysign($para_sort);
  69. //签名结果与签名方式加入请求提交参数组中
  70. $para_sort['sign'] = $_my_sign;
  71. $para_sort['sign_type'] = strtoupper(trim($this->alipay_config['sign_type']));
  72. return $para_sort;
  73. }
  74. /**
  75. * 生成要请求给支付宝的参数数组
  76. *
  77. * @param array $para_temp 请求前的参数数组
  78. *
  79. * @return bool|string 要请求的参数数组字符串
  80. */
  81. function buildRequestParaToString($para_temp) {
  82. //待请求参数数组
  83. $para = $this->buildRequestPara($para_temp);
  84. //把参数组中所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码
  85. $request_data = createLinkStringUrlencode($para);
  86. return $request_data;
  87. }
  88. /**
  89. * 客户端请求串
  90. *
  91. * @param array $para_temp
  92. *
  93. * @return bool|string
  94. */
  95. function buildClientRequestParaToString($para_temp) {
  96. $para_filter = [];
  97. while (list ($key, $val) = each($para_temp)) {
  98. if ($key == "sign" || $key == "sign_type" || $val == "") {
  99. continue;
  100. } else {
  101. $para_filter[$key] = "\"".$val."\"";
  102. }
  103. }
  104. //待请求参数数组
  105. $para = $this->buildRequestPara($para_filter);
  106. $para['sign'] = "\"".urlencode($para['sign'])."\"";
  107. $para['sign_type'] = "\"".$para['sign_type']."\"";
  108. //把参数组中所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码
  109. $request_data = $this->createClientLinkString($para);
  110. return $request_data;
  111. }
  112. /**
  113. * @param array $para
  114. *
  115. * @return bool|string
  116. */
  117. function createClientLinkString($para) {
  118. $arg = "";
  119. while (list ($key, $val) = each($para)) {
  120. $arg .= $key."=".$val."&";
  121. }
  122. //去掉最后一个&字符
  123. $arg = substr($arg, 0, strlen($arg) - 1);
  124. //如果存在转义字符,那么去掉转义
  125. if (get_magic_quotes_gpc()) {
  126. $arg = stripslashes($arg);
  127. }
  128. return $arg;
  129. }
  130. /**
  131. * 建立请求,以表单HTML形式构造(默认)
  132. *
  133. * @param array $para_temp 请求参数数组
  134. * @param string $method 提交方式。两个值可选:post、get
  135. * @param string $button_name 确认按钮显示文字
  136. *
  137. * @return string 提交表单HTML文本
  138. */
  139. function buildRequestForm($para_temp, $method, $button_name = '') {
  140. //待请求参数数组
  141. $para = $this->buildRequestPara($para_temp);
  142. $sHtml = "<form id='alipaysubmit' name='alipaysubmit' action='".$this->alipay_gateway_new."_input_charset="
  143. .trim(strtolower($this->alipay_config['input_charset']))."' method='".$method."'>";
  144. while (list ($key, $val) = each($para)) {
  145. $sHtml .= "<input type='hidden' name='".$key."' value='".$val."'/>";
  146. }
  147. $sHtml = $sHtml.'</form>';
  148. return $sHtml;
  149. }
  150. /**
  151. * 建立请求,以模拟远程HTTP的POST请求方式构造并获取支付宝的处理结果
  152. *
  153. * @param array $para_temp 请求参数数组
  154. *
  155. * @return mixed|string 支付宝处理结果
  156. */
  157. function buildRequestHttp($para_temp) {
  158. //待请求参数数组字符串
  159. $request_data = $this->buildRequestPara($para_temp);
  160. //远程获取数据
  161. $_rs = getHttpResponsePOST(
  162. $this->alipay_gateway_new, $this->alipay_config['cacert'], $request_data,
  163. trim(strtolower($this->alipay_config['input_charset']))
  164. );
  165. return $_rs;
  166. }
  167. /**
  168. * 建立请求,以模拟远程HTTP的POST请求方式构造并获取支付宝的处理结果,带文件上传功能
  169. *
  170. * @param array $para_temp 请求参数数组
  171. * @param string $file_para_name 文件类型的参数名
  172. * @param string $file_name 文件完整绝对路径
  173. *
  174. * @return mixed 支付宝返回处理结果
  175. */
  176. function buildRequestHttpInFile($para_temp, $file_para_name, $file_name) {
  177. //待请求参数数组
  178. $para = $this->buildRequestPara($para_temp);
  179. $para[$file_para_name] = "@".$file_name;
  180. //远程获取数据
  181. $_rs = getHttpResponsePOST(
  182. $this->alipay_gateway_new, $this->alipay_config['cacert'], $para,
  183. trim(strtolower($this->alipay_config['input_charset']))
  184. );
  185. return $_rs;
  186. }
  187. /**
  188. * 用于防钓鱼,调用接口query_timestamp来获取时间戳的处理函数
  189. * 注意:该功能PHP5环境及以上支持,因此必须服务器、本地电脑中装有支持DOMDocument、SSL的PHP配置环境。建议本地调试时使用PHP开发软件
  190. *
  191. * @return string 时间戳字符串
  192. */
  193. function query_timestamp() {
  194. $url = $this->alipay_gateway_new."service=query_timestamp&partner=".trim(
  195. strtolower($this->alipay_config['partner'])
  196. )."&_input_charset=".trim(strtolower($this->alipay_config['input_charset']));
  197. $doc = new DOMDocument();
  198. $doc->load($url);
  199. $itemEncrypt_key = $doc->getElementsByTagName("encrypt_key");
  200. $encrypt_key = $itemEncrypt_key->item(0)->nodeValue;
  201. return $encrypt_key;
  202. }
  203. }