Alipay.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <?php
  2. namespace app\common\extend\pay;
  3. class Alipay {
  4. public $name = '支付宝';
  5. public $ver = '1.0';
  6. public function submit($user,$order,$param)
  7. {
  8. $data = array();
  9. $data['service'] = 'create_direct_pay_by_user';//使用即时到帐交易接口
  10. $data['payment_type'] = '1';//默认值为:1(商品购买)
  11. $data['quantity'] = '1';//数量
  12. $data['_input_charset'] = 'utf-8';
  13. $data['partner'] = trim($GLOBALS['config']['pay']['alipay']['appid']);
  14. $data['seller_email'] = trim($GLOBALS['config']['pay']['alipay']['account']);
  15. $data['out_trade_no'] = $order['order_code'];
  16. $data['notify_url'] = $GLOBALS['http_type'] . $_SERVER['HTTP_HOST'] . '/index.php/payment/notify/pay_type/alipay';
  17. $data['return_url'] = $GLOBALS['http_type'] . $_SERVER['HTTP_HOST'] . '/index.php/payment/notify/pay_type/alipay';
  18. $data['subject'] = '积分充值(UID:'.$user['user_id'].')';
  19. $data['total_fee'] = sprintf("%.2f",$order['order_price']);
  20. //待请求参数数组
  21. $para = $this->buildRequestPara($data);
  22. $sHtml = "<form id='alipaysubmit' name='alipaysubmit' action='https://mapi.alipay.com/gateway.do?_input_charset=utf-8' method='POST'>";
  23. while (list ($key, $val) = each ($para)) {
  24. $sHtml.= "<input type='hidden' name='".$key."' value='".$val."'/>";
  25. }
  26. //submit按钮控件请不要含有name属性
  27. $sHtml = $sHtml."<input type='submit' value='正在提交'></form>";
  28. $sHtml = $sHtml."<script>document.forms['alipaysubmit'].submit();</script>";
  29. echo $sHtml;
  30. die;
  31. }
  32. public function notify()
  33. {
  34. $param = input();
  35. $GLOBALS['config']['pay'] = config('maccms.pay');
  36. unset($param['/payment/notify/pay_type/alipay']);
  37. unset($param['pay_type']);
  38. $isSign = $this->getSignVeryfy($param, $param["sign"]);
  39. //验证成功
  40. if($isSign) {
  41. if ($param['trade_status'] == 'TRADE_SUCCESS') {
  42. $res = model('Order')->notify($param['out_trade_no'],'alipay');
  43. if($res['code']>1){
  44. echo "fail2";
  45. }
  46. else{
  47. echo "success2";
  48. }
  49. }
  50. else {
  51. echo "success";
  52. }
  53. }else{
  54. echo "fail";
  55. }
  56. }
  57. public function buildRequestPara($para_temp) {
  58. //除去待签名参数数组中的空值和签名参数
  59. $para_filter = $this->paraFilter($para_temp);
  60. //对待签名参数数组排序
  61. $para_sort = $this->argSort($para_filter);
  62. //生成签名结果
  63. $mysign = $this->buildRequestMysign($para_sort);
  64. //签名结果与签名方式加入请求提交参数组中
  65. $para_sort['sign'] = $mysign;
  66. $para_sort['sign_type'] = 'MD5';
  67. return $para_sort;
  68. }
  69. public function paraFilter($para) {
  70. $para_filter = array();
  71. while (list ($key, $val) = each ($para)) {
  72. if($key == "sign" || $key == "sign_type" || $val == "")continue;
  73. else $para_filter[$key] = $para[$key];
  74. }
  75. return $para_filter;
  76. }
  77. public function argSort($para) {
  78. ksort($para);
  79. reset($para);
  80. return $para;
  81. }
  82. public function buildRequestMysign($para_sort) {
  83. //把数组所有元素,按照"参数=参数值"的模式用"&"字符拼接成字符串
  84. $prestr = $this->createLinkstring($para_sort);
  85. $mysign = $this->md5Sign($prestr, $GLOBALS['config']['pay']['alipay']['appkey']);
  86. return $mysign;
  87. }
  88. public function createLinkstring($para) {
  89. $arg = "";
  90. while (list ($key, $val) = each ($para)) {
  91. $arg.=$key."=".$val."&";
  92. }
  93. //去掉最后一个&字符
  94. $arg = substr($arg,0,count($arg)-2);
  95. //如果存在转义字符,那么去掉转义
  96. if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
  97. return $arg;
  98. }
  99. public function md5Sign($prestr, $key) {
  100. $prestr = $prestr . $key;
  101. return md5($prestr);
  102. }
  103. public function getSignVeryfy($para_temp, $sign) {
  104. //除去待签名参数数组中的空值和签名参数
  105. $para_filter = $this->paraFilter($para_temp);
  106. //对待签名参数数组排序
  107. $para_sort = $this->argSort($para_filter);
  108. //把数组所有元素,按照"参数=参数值"的模式用"&"字符拼接成字符串
  109. $prestr = $this->createLinkstring($para_sort);
  110. $isSgin = false;
  111. $isSgin = $this->md5Verify($prestr, $sign, $GLOBALS['config']['pay']['alipay']['appkey']);
  112. return $isSgin;
  113. }
  114. public function md5Verify($prestr, $sign, $key) {
  115. $prestr = $prestr . $key;
  116. $mysgin = md5($prestr);
  117. if($mysgin == $sign) {
  118. return true;
  119. }
  120. else {
  121. return false;
  122. }
  123. }
  124. }