<?php
/**
 * Created by PhpStorm.
 * User: stanley-king
 * Date: 2017/6/1
 * Time: 下午9:54
 */

namespace Pay;

define(JSPAY_PATHEX, BASE_DATA_PATH . '/api/pub_wxpay');
require_once(JSPAY_PATHEX . '/lib/WxPay.Api.php');
require_once(JSPAY_PATHEX . '/lib/WxPay.Config.php');
require_once(JSPAY_PATHEX . '/lib/WxPay.Data.php');
require_once(JSPAY_PATHEX . '/lib/WxPay.Exception.php');
require_once(JSPAY_PATHEX . '/lib/WxPay.Notify.php');

use \WxPayUnifiedOrder;
use \WxPayApi;
use \WxPayJsApiPay;
use \WxPayException;


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

    private $mOpenId;

    public function __construct($openid)
    {
        $this->mOpenId = $openid;
    }

    public function gen_pay($pay_sn,$fee,$order_sn,$subject)
    {
        $input = new WxPayUnifiedOrder();
        $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("JSAPI");
        $input->SetOpenid($this->mOpenId);
        $order = WxPayApi::unifiedOrder($input);

        if(!array_key_exists("appid", $order)
            || !array_key_exists("prepay_id", $order)
            || $order['prepay_id'] == "")
        {
            throw new WxPayException("参数错误");
        }

        $jsapi = new WxPayJsApiPay();
        $jsapi->SetAppid($order["appid"]);
        $timeStamp = time();
        $jsapi->SetTimeStamp("$timeStamp");
        $jsapi->SetNonceStr(WxPayApi::getNonceStr());
        $jsapi->SetPackage("prepay_id=" . $order['prepay_id']);
        $jsapi->SetSignType("MD5");
        $jsapi->SetPaySign($jsapi->MakeSign());

        return array("data" => $jsapi->GetValues());
    }

    public function on_notify($post)
    {

    }
}