ShoppayController.php 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkCMF [ WE CAN DO IT MORE SIMPLE ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2013-2014 http://www.thinkcmf.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Author: Dean <zxxjjforever@163.com>
  8. // +----------------------------------------------------------------------
  9. namespace app\appapi\controller;
  10. use cmf\controller\HomeBaseController;
  11. use think\facade\Db;
  12. /**
  13. * 商城订单支付回调
  14. */
  15. class ShoppayController extends HomebaseController {
  16. //支付宝 回调
  17. public function notify_ali() {
  18. $configpri=getConfigPri();
  19. require_once(CMF_ROOT."sdk/alipay/alipay_app/alipay.config.php");
  20. $alipay_config['partner'] = $configpri['aliapp_partner'];
  21. require_once(CMF_ROOT."sdk/alipay/alipay_app/lib/alipay_core.function.php");
  22. require_once(CMF_ROOT."sdk/alipay/alipay_app/lib/alipay_rsa.function.php");
  23. require_once(CMF_ROOT."sdk/alipay/alipay_app/lib/alipay_notify.class.php");
  24. //计算得出通知验证结果
  25. $alipayNotify = new \AlipayNotify($alipay_config);
  26. $verify_result = $alipayNotify->verifyNotify();
  27. $this->logali("ali_data:".json_encode($_POST));
  28. if($verify_result) {//验证成功
  29. //商户订单号
  30. $out_trade_no = $_POST['out_trade_no'];
  31. //支付宝交易号
  32. $trade_no = $_POST['trade_no'];
  33. //交易状态
  34. $trade_status = $_POST['trade_status'];
  35. //交易金额
  36. $total_fee = $_POST['total_fee'];
  37. if($_POST['trade_status'] == 'TRADE_FINISHED') {
  38. //判断该笔订单是否在商户网站中已经做过处理
  39. //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
  40. //如果有做过处理,不执行商户的业务程序
  41. //注意:
  42. //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
  43. //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
  44. //调试用,写文本函数记录程序运行情况是否正常
  45. //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
  46. }else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
  47. //判断该笔订单是否在商户网站中已经做过处理
  48. //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
  49. //如果有做过处理,不执行商户的业务程序
  50. //注意:
  51. //付款完成后,支付宝系统发送该交易状态通知
  52. //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
  53. //调试用,写文本函数记录程序运行情况是否正常
  54. //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
  55. $where['orderno']=$out_trade_no;
  56. $where['total']=$total_fee;
  57. $data=[
  58. 'type'=>1,
  59. 'trade_no'=>$trade_no
  60. ];
  61. $this->logali("where:".json_encode($where));
  62. $res=handelShopOrder($where,$data);
  63. if($res==0){
  64. $this->logali("orderno:".$out_trade_no.' 订单信息不存在');
  65. echo "fail";
  66. return;
  67. }
  68. if($res==-1){
  69. $this->logali("orderno:".$out_trade_no.' 订单已关闭');
  70. echo "success";
  71. return;
  72. }
  73. $this->logali("成功");
  74. echo "success"; //请不要修改或删除
  75. return;
  76. }
  77. echo "fail"; //请不要修改或删除
  78. return;
  79. }else {
  80. $this->logali("验证失败");
  81. //验证失败
  82. echo "fail";
  83. return;
  84. }
  85. }
  86. /* 支付宝支付 */
  87. /* 微信支付 */
  88. private $wxDate = null;
  89. public function notify_wx(){
  90. $config=getConfigPri();
  91. //$xmlInfo = $GLOBALS['HTTP_RAW_POST_DATA'];
  92. $xmlInfo=file_get_contents("php://input");
  93. //解析xml
  94. $arrayInfo = $this -> xmlToArray($xmlInfo);
  95. /*$str='{"appid":"wx7b15e53670b17b58","bank_type":"CCB_DEBIT","cash_fee":"1","fee_type":"CNY","is_subscribe":"N","mch_id":"1550219281","nonce_str":"61cf3153ce5820129d42fe2a079daeee","openid":"oPxn90xeS3_ir7pdOa-QTjAFhYf0","out_trade_no":"19862_20210616094305537","result_code":"SUCCESS","return_code":"SUCCESS","sign":"BA8E9F599719408FD8B623352FB3EE49","time_end":"20210616094309","total_fee":"1","trade_type":"APP","transaction_id":"4200001150202106163253871323"}';
  96. $arrayInfo=json_decode($str,true);*/
  97. $this -> wxDate = $arrayInfo;
  98. $this -> logwx("wx_data:".json_encode($arrayInfo));//log打印保存
  99. if($arrayInfo['return_code'] == "SUCCESS"){
  100. // if($return_msg != null){
  101. // echo $this -> returnInfo("FAIL","签名失败");
  102. // $this -> logwx("签名失败:".$sign);//log打印保存
  103. // return;
  104. // }else{
  105. $wxSign = $arrayInfo['sign'];
  106. unset($arrayInfo['sign']);
  107. $arrayInfo['appid'] = $config['wx_appid'];
  108. $arrayInfo['mch_id'] = $config['wx_mchid'];
  109. $key = $config['wx_key'];
  110. ksort($arrayInfo);//按照字典排序参数数组
  111. $sign = $this -> sign($arrayInfo,$key);//生成签名
  112. $this -> logwx("数据打印测试签名signmy:".$sign.":::微信sign:".$wxSign);//log打印保存
  113. if($this -> checkSign($wxSign,$sign)){
  114. echo $this -> returnInfo("SUCCESS","OK");
  115. $this -> logwx("签名验证结果成功:".$sign);//log打印保存
  116. $this -> orderServer();//订单处理业务逻辑
  117. return;
  118. }else{
  119. echo $this -> returnInfo("FAIL","签名失败");
  120. $this -> logwx("签名验证结果失败:本地加密:".$sign.':::::三方加密'.$wxSign);//log打印保存
  121. return;
  122. }
  123. //}
  124. }else{
  125. echo $this -> returnInfo("FAIL","签名失败");
  126. $this -> logwx($arrayInfo['return_code']);//log打印保存
  127. return;
  128. }
  129. }
  130. private function returnInfo($type,$msg){
  131. if($type == "SUCCESS"){
  132. return $returnXml = "<xml><return_code><![CDATA[{$type}]]></return_code></xml>";
  133. }else{
  134. return $returnXml = "<xml><return_code><![CDATA[{$type}]]></return_code><return_msg><![CDATA[{$msg}]]></return_msg></xml>";
  135. }
  136. }
  137. //签名验证
  138. private function checkSign($sign1,$sign2){
  139. return trim($sign1) == trim($sign2);
  140. }
  141. /* 订单查询加值业务处理
  142. * @param orderNum 订单号
  143. */
  144. private function orderServer(){
  145. $info = $this -> wxDate;
  146. $this->logwx("info:".json_encode($info));
  147. $where['orderno']=$info['out_trade_no'];
  148. $where['total']=$info['total_fee']/100;
  149. $trade_no=$info['transaction_id'];
  150. $data=[
  151. 'type'=>2,
  152. 'trade_no'=>$trade_no
  153. ];
  154. $this->logwx("where:".json_encode($where));
  155. $res=handelShopOrder($where,$data);
  156. if($res==0){
  157. $this->logwx("orderno:".$out_trade_no.' 订单信息不存在');
  158. return false;
  159. }
  160. if($res==-1){
  161. $this->logwx("orderno:".$out_trade_no.' 订单已关闭');
  162. return false;
  163. }
  164. $this->logwx("成功");
  165. return true;
  166. }
  167. /**
  168. * sign拼装获取
  169. */
  170. private function sign($param,$key){
  171. $sign = "";
  172. foreach($param as $k => $v){
  173. $sign .= $k."=".$v."&";
  174. }
  175. $sign .= "key=".$key;
  176. $sign = strtoupper(md5($sign));
  177. return $sign;
  178. }
  179. /**
  180. * xml转为数组
  181. */
  182. private function xmlToArray($xmlStr){
  183. $msg = array();
  184. $postStr = $xmlStr;
  185. $msg = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
  186. return $msg;
  187. }
  188. /* 微信支付 */
  189. /* 苹果支付 */
  190. /* 打印log */
  191. public function logali($msg){
  192. file_put_contents(CMF_ROOT.'data/log/shoppaylog/logali_'.date('Y-m-d').'.txt',date('Y-m-d H:i:s').' msg:'.$msg.PHP_EOL.PHP_EOL,FILE_APPEND);
  193. }
  194. /* 打印log */
  195. public function logwx($msg){
  196. file_put_contents(CMF_ROOT.'data/log/shoppaylog/logwx_'.date('Y-m-d').'.txt',date('Y-m-d H:i:s').' msg:'.$msg.PHP_EOL.PHP_EOL,FILE_APPEND);
  197. }
  198. }