<?php

/**
 *   微信支付: 后台下单
 *
 */
require_once __DIR__ . '/../../../../main.php';                                 # 导入游戏库
require_once __DIR__ . '/../../Mo/resp.php';                                    # 响应模型
require_once __DIR__ . '/../../Mo/payRequest.php';                              # 通用请求订单结构
require_once __DIR__ . '/wx.php';                                               # 导入微信支付lib
//require_once __DIR__ . '/config_alipay.php';                                    # 导入配置文件

use loyalsoft\CLog;                                                             # 添加 use
use loyalsoft\JsonUtil;
use loyalsoft\HttpUtil;

$tag = "[weixin]";
HttpUtil::PostOnly();                                                           # 限定客户端用post
$str = HttpUtil::getQueryString();                                              # 提取参数串
// $str=gzinflate($str);                                                         # 编码方案
$data = JsonUtil::decode($str);                                                 # 提取数据
$req = new PayRequest($data);                                                   # 创建订单
if ($req->InserDataBase()) {                                                    # 订单数据入库
    CLog::pay($tag . ' 创建订单' . $req);
    $input = new WxPayUnifiedOrder();                                           # 微信下单参数
    $input->SetBody(WxPayConfig::APPID . "-" . $req->product_name);             # 商品描述,格式: 应用名称-商品
    $input->SetAttach($req->callbackInfo);                                      # 透传参数
    $input->SetOut_trade_no($req->cpOrderId);                                   # cporderidd
    $input->SetTotal_fee($req->amount * 100);                                   # 总价格,单位:分
    $input->SetTime_start(date("YmdHis"));                                      # 开始时间  
    $input->SetTime_expire(date("YmdHis", time() + 600));                       # 过期时间
    $input->SetGoods_tag("test");                                               # 活动标记,不管
    $input->SetNotify_url($req->notifyUrl);                                     # 支付回调地址
    $input->SetTrade_type("APP");                                               # 交易类型, 
//    $input->SetTrade_type("JSAPI");
//    $input->SetOpenid($openId);                                                 # jsapi需要,其他非必需
    CLog::pay("[weixin]统一下单");
    CLog::pay(var_export($input->GetValues(), true));
    $order = WxPayApi::unifiedOrder($input);                                    # 向微信后台发起统一订单请求, 返回值是asoc_array
    if (isset($order['return_code']) && $order['return_code'] == 'SUCCESS') {   # 推送订单请求
        if (isset($order["result_code"]) && $order["result_code"] == 'SUCCESS') {# 操作成功
            $platPayParams = array(#                                            # 客户端需要的参数
                'appid' => WxPayConfig::APPID, #                                # 微信开平分配的appid
                'partnerid' => WxPayConfig::MCHID, #                            # 微信支付平台分配的商户id
                'prepayid' => $order["prepay_id"], #                             # 预支付交易会话id (微信返回的支付交易会话ID) 
                'package' => 'Sign=WXPay', #                                    # 扩展字段, 固定值Sign=WXPay
                'noncestr' => WxPayApi::getNonceStr(), #                        # 随机字符串
                'timestamp' => \loyalsoft\now(), #                              # 时间戳
            );
            $_sign = WxPayConfig::MakeSign($platPayParams);                     # 计算下签名 
            $platPayParams["sign"] = $_sign;                                    # 附加签名
            $platPayParams['extData'] = $req->callbackInfo;                     # 透传参数
            $ret = array(#                                                      # 返回值
                'err' => 0, #                                                   # 错误码
                'platformCode' => 'wx', #                                       # 平台 wx/zfbs
                'cpOrderId' => $req->cpOrderId, #                               # 渠道订单号
                'platformInfo' => $platPayParams                                # 微信所需参数
            );
            echo json_encode($ret);                                             # 返回客户端
            CLog::pay("[$tag.pay]向$tag 后台推送订单成功" . $req);
        } else {
            CLog::pay("[$tag.pay]向$tag 后台推送订单操作失败." . $order['err_code_des']);
            echo Resp::err($order['err_code'], $order['err_code_des']);
        }
    } else {
        CLog::pay($order);
        CLog::pay("[$tag.pay]向$tag 后台推送订单失败, 通讯失败.");
        echo Resp::err(1, "微信统一下单请求,通讯失败!");
    }
//    echo Resp::ok($req->retData());                                             # 返回值
} else {
    CLog::pay($tag . ' 创建订单失败' . $req);
    echo Resp::err(1, '后台创建订单失败');                                       # 返回值
}


