<?php
/**
 * Created by PhpStorm.
 * User: stanley-king
 * Date: 16/9/21
 * Time: 下午7:53
 */

namespace Pay;

define(WXPAY_PATHEX, BASE_DATA_PATH . '/api/open_wxpay');
require_once(WXPAY_PATHEX . '/lib/OpenWxPay.Api.php');
require_once(WXPAY_PATHEX . '/lib/OpenWxPay.Config.php');
require_once(WXPAY_PATHEX . '/lib/OpenWxPay.Data.php');
require_once(WXPAY_PATHEX . '/lib/OpenWxPay.Exception.php');
require_once(WXPAY_PATHEX . '/lib/OpenWxPay.Notify.php');

use \OpenWxPayUnifiedOrder;
use \OpenWxPayApi;
use \Log;
use \OpenWxPayConfig;

class wxpay implements IPay
{
    const wx_notifyurl  = BASE_SITE_URL . '/mobile/wxnotify.php';
    const wx_orderquery = 'https://api.mch.weixin.qq.com/pay/orderquery';

    public function gen_pay($pay_sn,$fee,$order_sn,$subject)
    {
        $input = new OpenWxPayUnifiedOrder();
        $input->SetBody($subject); //商品或支付单简要描述
        $input->SetAttach($pay_sn); //附加数据，在查询API和支付通知中原样返回，该字段主要用于商户携带订单的自定义数据
        $out_trade_no = $pay_sn . sprintf("%03d",mt_rand(0,999)); //给微信用的每次重新生成的商户订单SN, 避免二次支付, 数额修改导致支付失败
        $input->SetOut_trade_no($out_trade_no);//商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号

        $input->SetTotal_fee("{$fee}");//订单总金额，单位为分，详见支付金额
        $input->SetTime_start(date("YmdHis")); //订单生成时间，格式为yyyyMMddHHmmss，如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
        $input->SetTime_expire(date("YmdHis", time() + 600));//订单失效时间，格式为yyyyMMddHHmmss，如2009年12月27日9点10分10秒表示为20091227091010。其他详见时间规则
        $input->SetNotify_url(self::wx_notifyurl);
        $input->SetTrade_type("APP");//JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付，统一下单接口trade_type的传参可参考这里,MICROPAY--刷卡支付，刷卡支付有单独的支付接口，不调用统一下单接口
        //$input->SetTrade_type("JSAPI");
        $order = OpenWxPayApi::unifiedOrder($input);

        $sorder = $this->toString($order);
        Log::record($sorder, Log::DEBUG);

        if (array_key_exists('err_code', $order)) {
            return false;
        }

        $ret['appid'] = $order["appid"];
        $ret['noncestr'] = OpenWxPayApi::getNonceStr();
        $ret['package'] = 'Sign=WXPay';
        $ret['partnerid'] = OpenWxPayConfig::MCHID;
        $ret['prepayid'] = $order['prepay_id'];
        $timeStamp = time();
        $ret['timestamp'] = "{$timeStamp}";
        $ret['sign'] = $this->make_sign($ret);

        return array("data" => $ret);
    }

    private function toString($order)
    {
        $ret = '';
        foreach ($order as $key => $val) {
            $ret .= $key . "=" . $val;
            $ret .= '&';
        }

        return $ret;
    }
    private function make_sign($values)
    {
        //签名步骤一：按字典序排序参数
        ksort($values);
        $string = $this->to_url_params($values);
        //签名步骤二：在string后加入KEY
        $string = $string . "&key=" . OpenWxPayConfig::KEY;
        //签名步骤三：MD5加密
        $string = md5($string);
        //签名步骤四：所有字符转为大写
        $result = strtoupper($string);
        return $result;
    }

    private function to_url_params($values)
    {
        $buff = "";
        foreach ($values as $k => $v) {
            if ($k != "sign" && $v != "" && !is_array($v)) {
                $buff .= $k . "=" . $v . "&";
            }
        }

        $buff = trim($buff, "&");
        return $buff;
    }
    public function on_notify($post)
    {

    }
}