notify.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <?php
  2. /**
  3. * 接收客户端的通知(客户端支付回调通知后台)(发货(元宝)并扣除游戏币)
  4. * @version
  5. * 1.0.0 Created at 2017-12-30. by --gwang
  6. * @author gwang (mail@wanggangzero.cn)
  7. * @copyright ? 2017-12-30, SJZ LoyalSoft Corporation & gwang. All rights reserved.
  8. *
  9. */
  10. // 导入应用宝支付库
  11. require_once __DIR__ . '/ysdks/Api.php';
  12. require_once __DIR__ . '/ysdks/Ysdk.php';
  13. require_once __DIR__ . '/ysdks/Payments.php';
  14. // 导入游戏自定义库
  15. include_once __DIR__ . '/../../../main.php'; # 导入game utils
  16. include_once __DIR__ . '/../Mo/payResp.php'; # 导入通用返回值结构
  17. include_once __DIR__ . '/../Mo/payRequest.php'; # 导入通用返回值结构
  18. require_once __DIR__ . '/../Mo/OrderNotice.php';
  19. require_once 'config.yyb.php'; # 配置文件
  20. // 签名算法
  21. use loyalsoft\CLog;
  22. use loyalsoft\HttpUtil;
  23. use loyalsoft\JsonUtil;
  24. use loyalsoft\pay\OrderNotice;
  25. $tag = "[notify.yyb]"; # 日志标签
  26. try {
  27. CLog::pay("$tag 收到客户端支付通知: " . HttpUtil::getQueryString());
  28. $str = HttpUtil::getQueryString();
  29. // $str = gzinflate($str);
  30. $params = JsonUtil::decode($str); # 提取参数
  31. $plat = $params->plat;
  32. $openid = $params->openId;
  33. $openkey = $params->openKey; # (手Q的paytoken,微信的accessToken)
  34. $pf = $params->pf;
  35. $pfkey = $params->pfKey;
  36. $params->uid = $openid;
  37. // $pay_token = $params->pay_token;
  38. // $accessToken = $params->access_token;
  39. $accout_type = $plat; # "qq" or "wx"
  40. $zoneId = 1;
  41. $tsnow = loyalsoft\now();
  42. $baseParam = array(
  43. 'openid' => $openid,
  44. 'openkey' => $openkey,
  45. 'ts' => $tsnow,
  46. 'pf' => $pf,
  47. 'pfkey' => $pfkey,
  48. 'zoneid' => $zoneid,
  49. );
  50. $cfg = config_for_yyb::Inst($plat); # 配置信息
  51. $order = OrderNotice::Parse_yybOrder(loyalsoft\CommUtil::object_array($params)); # 将参数归一化到order
  52. if ($order != null) {
  53. if ($order->Check()) { # 订单校验, 1代表支付成功
  54. if ($order->status == 1) { # 订单状态是成功
  55. // 应用宝需要先在后台进行扣费,确认成功后再将订单转为已付款.
  56. $sdk = new Api($cfg->appid, $cfg->appkey); // 创建YSDK实例
  57. $sdk->setPay($cfg->pay_appid, $cfg->pay_appkey); // 设置支付信息
  58. $sdk->setServerName($cfg->server_name); // 设置YSDK调用环境(沙箱地址/现网地址)
  59. $params = $baseParam;
  60. $ret = get_balance_m($sdk, $params, $accout_type);
  61. if ($ret->ret) { # 查询余额失败
  62. echo payResp::err($ret->ret, $ret->msg);
  63. CLog::pay($tag . ' 查询游戏币余额失败!');
  64. } else { # 查询余额成功
  65. $balance = $ret->balance; # 当前余额
  66. if ($order->amount <= $balance * 10) { # 校验余额成功
  67. $params = $baseParam;
  68. $params['billno'] = $order->cpOrderId;
  69. $params['amt'] = $order->amount / 10;
  70. $ret = pay_m($sdk, $params, $accout_type);
  71. if ($ret->ret) { # 扣费失败
  72. echo payResp::err(-1, '扣除游戏币失败');
  73. CLog::pay($tag . ' 扣除游戏币失败!');
  74. } else { # 扣费成功
  75. $order->UpdateOrderStatus(); # 更新订单状态,->已付款
  76. echo payResp::ok($ret);
  77. CLog::pay("$tag [发货] 订单: " . $order->cpOrderId . ", 金额: " . $order->amount);
  78. }
  79. } else { # 游戏币余额不足
  80. echo payResp::err(-1, '游戏币余额不足');
  81. CLog::pay($tag . ' 游戏币余额不足!');
  82. }
  83. }
  84. } else if ($order->status == 2) { # status为2(failed)的情况
  85. $order->UpdateOrderStatus(); # 直接更新订单状态,->支付失败
  86. echo payResp::err(999, 'closed!'); # ps. 与曹强约定999代表成功取消订单
  87. CLog::pay("$tag [不发货] 订单: " . $order->cpOrderId);
  88. } else {
  89. echo payResp::err(-1, '未知的支付状态');
  90. CLog::pay("$tag [处理结果]: FAILURE (未知的支付状态)"); # 日志
  91. }
  92. } else {
  93. CLog::pay("$tag [处理结果]:" . "FAILURE 后台订单校验失败"); # 日志
  94. echo payResp::err(1, '后台订单校验失败');
  95. }
  96. } else { # 请求参数
  97. CLog::pay("$tag [处理结果]:" . "FAILURE 通知参数提取失败"); # 日志
  98. echo payResp::err(1, '通知参数有问题');
  99. }
  100. } catch (Exception $e) {
  101. CLog::pay($tag . $e->getMessage()); # 日志
  102. echo payResp::err(2, $e->getMessage());
  103. }