alipay.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. <?php
  2. /**
  3. * 支付接口
  4. * 好商城V3-B10 33hao.com
  5. *
  6. */
  7. defined('InShopNC') or exit('Access Invalid!');
  8. require_once("lib/alipay_submit.class.php");
  9. class alipay {
  10. /**************************调用授权接口alipay.wap.trade.create.direct获取授权码token**************************/
  11. //返回格式
  12. private $format = "";
  13. //必填,不需要修改
  14. //返回格式
  15. private $v = "";
  16. //必填,不需要修改
  17. //请求号
  18. private $req_id = "";
  19. //必填,须保证每次请求都是唯一
  20. //**req_data详细信息**
  21. //服务器异步通知页面路径
  22. private $notify_url = "";
  23. //需http://格式的完整路径,不允许加?id=123这类自定义参数
  24. //页面跳转同步通知页面路径
  25. private $call_back_url = "";
  26. //需http://格式的完整路径,不允许加?id=123这类自定义参数
  27. //卖家支付宝账户
  28. private $seller_email = "";
  29. //必填
  30. //商户订单号
  31. private $out_trade_no = "";
  32. //商户网站订单系统中唯一订单号,必填
  33. //订单名称
  34. private $subject = "";
  35. //必填
  36. //付款金额
  37. private $total_fee = "";
  38. //必填
  39. //请求业务参数详细
  40. private $req_data = "";
  41. //必填
  42. //配置
  43. private $alipay_config = array();
  44. /************************************************************/
  45. public function submit($param){
  46. $this->format = 'xml';
  47. $this->v = '2.0';
  48. $this->req_id = date('Ymdhis');
  49. $this->notify_url = MOBILE_SITE_URL.'/api/payment/alipay/notify_url.php';
  50. $this->call_back_url = MOBILE_SITE_URL.'/api/payment/alipay/call_back_url.php';
  51. $this->seller_email = $param['alipay_account'];
  52. //v3-b11
  53. $this->out_trade_no = $param['order_sn'].'-'.$param['order_type'];
  54. $this->subject = $param['order_sn'];
  55. $this->total_fee = $param['order_amount'];
  56. $this->alipay_config = array(
  57. 'partner' => $param['alipay_partner'],
  58. 'key' => $param['alipay_key'],
  59. 'private_key_path' => 'key/rsa_private_key.pem',
  60. 'ali_public_key_path' => 'key/alipay_public_key.pem',
  61. 'sign_type' => 'MD5',
  62. 'input_charset' => 'utf-8',
  63. 'cacert' => getcwd().'\\cacert.pem',
  64. 'transport' => 'http'
  65. );
  66. //请求业务参数详细
  67. $req_data = '<direct_trade_create_req><notify_url>' . $this->notify_url . '</notify_url><call_back_url>' . $this->call_back_url . '</call_back_url><seller_account_name>' . $this->seller_email . '</seller_account_name><out_trade_no>' . $this->out_trade_no . '</out_trade_no><subject>' . $this->subject . '</subject><total_fee>' . $this->total_fee . '</total_fee></direct_trade_create_req>';
  68. //必填
  69. //构造要请求的参数数组,无需改动
  70. $para_token = array(
  71. "service" => "alipay.wap.trade.create.direct",
  72. "partner" => trim($this->alipay_config['partner']),
  73. "sec_id" => trim($this->alipay_config['sign_type']),
  74. "format" => $this->format,
  75. "v" => $this->v,
  76. "req_id" => $this->req_id,
  77. "req_data" => $req_data,
  78. "_input_charset" => trim(strtolower($this->alipay_config['input_charset']))
  79. );
  80. //建立请求
  81. $alipaySubmit = new AlipaySubmit($this->alipay_config);
  82. $html_text = $alipaySubmit->buildRequestHttp($para_token);
  83. //URLDECODE返回的信息
  84. $html_text = urldecode($html_text);
  85. //解析远程模拟提交后返回的信息
  86. $para_html_text = $alipaySubmit->parseResponse($html_text);
  87. //获取request_token
  88. $request_token = $para_html_text['request_token'];
  89. /**************************根据授权码token调用交易接口alipay.wap.auth.authAndExecute**************************/
  90. //业务详细
  91. $req_data = '<auth_and_execute_req><request_token>' . $request_token . '</request_token></auth_and_execute_req>';
  92. //必填
  93. //构造要请求的参数数组,无需改动
  94. $parameter = array(
  95. "service" => "alipay.wap.auth.authAndExecute",
  96. "partner" => trim($this->alipay_config['partner']),
  97. "sec_id" => trim($this->alipay_config['sign_type']),
  98. "format" => $this->format,
  99. "v" => $this->v,
  100. "req_id" => $this->req_id,
  101. "req_data" => $req_data,
  102. "_input_charset" => trim(strtolower($this->alipay_config['input_charset']))
  103. );
  104. //建立请求
  105. $alipaySubmit = new AlipaySubmit($this->alipay_config);
  106. $html_text = $alipaySubmit->buildRequestForm($parameter, 'get', '正在跳转支付页面...');
  107. return '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  108. <html>
  109. <head>
  110. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  111. <title>支付宝即时到账交易接口接口</title>
  112. </head>'.$html_text.'
  113. </body>
  114. </html>';
  115. }
  116. /**
  117. * 获取return信息
  118. */
  119. public function getReturnInfo($payment_config) {
  120. $verify = $this->_verify('return', $payment_config);
  121. if($verify) {
  122. return array(
  123. //商户订单号
  124. 'out_trade_no' => $_GET['out_trade_no'],
  125. //支付宝交易号
  126. 'trade_no' => $_GET['trade_no'],
  127. );
  128. }
  129. return false;
  130. }
  131. /**
  132. * 获取notify信息
  133. */
  134. public function getNotifyInfo($payment_config) {
  135. $verify = $this->_verify('notify', $payment_config);
  136. if($verify) {
  137. $notify_data = $_POST['notify_data'];
  138. //解析notify_data
  139. //注意:该功能PHP5环境及以上支持,需开通curl、SSL等PHP配置环境。建议本地调试时使用PHP开发软件
  140. $doc = new DOMDocument();
  141. $doc->loadXML($notify_data);
  142. if( ! empty($doc->getElementsByTagName( "notify" )->item(0)->nodeValue) ) {
  143. //商户订单号
  144. $out_trade_no = $doc->getElementsByTagName( "out_trade_no" )->item(0)->nodeValue;
  145. //支付宝交易号
  146. $trade_no = $doc->getElementsByTagName( "trade_no" )->item(0)->nodeValue;
  147. //交易状态
  148. $trade_status = $doc->getElementsByTagName( "trade_status" )->item(0)->nodeValue;
  149. if($trade_status == 'TRADE_FINISHED' || $trade_status == 'TRADE_SUCCESS') {
  150. return array(
  151. //商户订单号
  152. 'out_trade_no' => $out_trade_no,
  153. //支付宝交易号
  154. 'trade_no' => $trade_no,
  155. );
  156. }
  157. }
  158. }
  159. return false;
  160. }
  161. /**
  162. * 验证返回信息
  163. */
  164. private function _verify($type, $payment_config) {
  165. if(empty($payment_config)) {
  166. return false;
  167. }
  168. $alipay_config = array(
  169. 'partner' => $payment_config['alipay_partner'],
  170. 'key' => $payment_config['alipay_key'],
  171. 'private_key_path' => 'key/rsa_private_key.pem',
  172. 'ali_public_key_path' => 'key/alipay_public_key.pem',
  173. 'sign_type' => 'MD5',
  174. 'input_charset' => 'utf-8',
  175. 'cacert' => getcwd().'\\cacert.pem',
  176. 'transport' => 'http'
  177. );
  178. require_once(BASE_PATH.DS.'api/payment/alipay/lib/alipay_notify.class.php');
  179. //计算得出通知验证结果
  180. $alipayNotify = new AlipayNotify($alipay_config);
  181. switch ($type) {
  182. case 'notify':
  183. $verify_result = $alipayNotify->verifyNotify();
  184. break;
  185. case 'return':
  186. $verify_result = $alipayNotify->verifyReturn();
  187. break;
  188. default:
  189. $verify_result = false;
  190. break;
  191. }
  192. return $verify_result;
  193. }
  194. }