pay.php 4.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <?php
  2. /**
  3. * 应用宝, 创建订单
  4. */
  5. // 导入应用宝支付库
  6. require_once __DIR__ . '/ysdks/Api.php';
  7. require_once __DIR__ . '/ysdks/Ysdk.php';
  8. require_once __DIR__ . '/ysdks/Payments.php';
  9. include_once __DIR__ . '/../../../main.php'; # 导入game utils
  10. include_once __DIR__ . '/../Mo/payResp.php'; # 导入通用返回值结构
  11. include_once __DIR__ . '/../Mo/payRequest.php'; # 导入通用订单请求结构
  12. require_once 'config.yyb.php'; # 配置文件, Ps. 里面用到了object
  13. use loyalsoft\CLog;
  14. use loyalsoft\JsonUtil;
  15. use loyalsoft\HttpUtil;
  16. $tag = "应用宝";
  17. HttpUtil::PostOnly(); # 限定客户端用post
  18. $str = HttpUtil::getQueryString(); # 提取参数串
  19. Clog::pay($tag . " 请求串 " . $str);
  20. // $str=gzinflate($str); # 编码方案
  21. $data = JsonUtil::decode($str); # 提取数据
  22. $req = new PayRequest($data); # 创建订单
  23. #
  24. //$resp = $req->AntiAdditionCheck(); # 防沉迷金额校验
  25. //if ($resp->err != 0) {
  26. // exit($resp); # 返回
  27. //}
  28. CLog::pay("平台字符串" . $req->getPlatStr());
  29. function encodeParams($params) {
  30. $arr = array();
  31. foreach ($params as $k => $value) {
  32. $arr[urlencode($k)] = urlencode($value);
  33. }
  34. return $arr;
  35. }
  36. if ($req->InserDataBase()) { # 订单数据入库
  37. CLog::pay($tag . ' 创建订单' . $req);
  38. $params = JsonUtil::decode($str); # 提取参数
  39. $plat = $params->plat; # "qq" or "wx"
  40. $openid = $params->openid;
  41. $openkey = $params->openkey; # (手Q的paytoken,微信的accessToken)
  42. $pf = $params->pf;
  43. $pfkey = $params->pfkey;
  44. $params->uid = $openid;
  45. // $pay_token = $params->pay_token;
  46. // $accessToken = $params->access_token;
  47. $account_type = $plat; # "qq" or "wx"
  48. $zoneId = 1; # 固定为1,不是游戏内的, 是传给腾讯的.
  49. $tsnow = loyalsoft\now();
  50. $baseParam = array(
  51. 'openid' => $openid,
  52. 'openkey' => $openkey,
  53. 'ts' => $tsnow,
  54. 'pf' => $pf,
  55. 'pfkey' => $pfkey,
  56. 'zoneid' => $zoneid,
  57. );
  58. $ysdkparams = $baseParam;
  59. $ysdkparams['payitem'] = $req->product_id . "*" . $req->product_price * 10 . "*" . $req->product_count;
  60. $ysdkparams['goodsmeta'] = str_replace('*', 'X', strlen($req->product_name) > 0 ? $req->product_name : "道具名称")
  61. . "*" . str_replace('*', 'X', strlen($req->product_desc) > 0 ? $req->product_desc : "道具描述缺失");
  62. $ysdkparams['goodsurl'] = "";
  63. $ysdkparams['appmode'] = 1; # 设置模式: 1不可修改数量, 2可以修改数量.
  64. $ysdkparams['app_metadata'] = $req->callbackInfo; # 透传参数
  65. encodeParams($ysdkparams);
  66. CLog::pay("[$tag]直购下单" . json_encode($ysdkparams));
  67. $cfg = config_for_yyb::Inst($plat); # 配置信息
  68. $sdk = new Api($cfg->appid, $cfg->appkey); // 创建YSDK实例
  69. $sdk->setPay($cfg->pay_appid, $cfg->pay_appkey); // 设置支付信息
  70. $sdk->setServerName($cfg->server_name); // 设置YSDK调用环境(沙箱地址/现网地址)
  71. $ret = buy_goods_m($sdk, $ysdkparams, $account_type); # 向YSDK后台发起统一订单请求, 返回值是asoc_array
  72. CLog::pay($ret);
  73. if ($ret->ret) { # 后台下单失败
  74. echo payResp::err($ret->ret, $ret->msg);
  75. CLog::pay("[$tag]向$tag 后台推送订单操作失败." . $ret->msg);
  76. } else {
  77. $arr = $req->retData();
  78. $r = array_merge($arr, (array) $ret); # 扩展下返回值
  79. echo payResp::ok($r);
  80. CLog::pay("[$tag]向$tag 后台推送订单成功" . json_encode($r));
  81. }
  82. } else {
  83. CLog::pay($tag . ' 创建订单失败' . $req);
  84. echo payResp::err(1, '后台创建订单失败'); # 返回值
  85. }