微信APP支付,PHP后端

app.php

生成二次签名的字串,发送给app参数。
<?php

require ("./pay.config.php");  
require ("./lib/WxPay.Api.php");  
require ("./WxPay.AppPay.php");


    //=========================配置订单(充值)标题、价格、状态通知链接 start

    $notify_url = 'http://wwww.xxx.com/WxPay/native_notify.php';
    //=========================配置订单(充值)标题、价格、状态通知链接 end


    $notify = new AppPay();
    /*首先生成prepayid*/
    $fee = sprintf("%.0f", $pay_config['total_fee'] * 100);
    $input = new WxPayUnifiedOrder();
    $input->SetBody($pay_config['body']);
    $input->SetAttach($pay_config['body']);
    $input->SetOut_trade_no($out_trade_no);
    $input->SetTotal_fee($fee);
    $input->SetTime_start(date("YmdHis"));
    $input->SetTime_expire(date("YmdHis", time() + 600));
    $input->SetGoods_tag($pay_config['body']);
    $input->SetNotify_url($notify_url);
    $input->SetTrade_type("APP");
    $input->SetProduct_id($Product_id);
    $order = WxPayApi::unifiedOrder($input);//获得订单的基本信息,包括prepayid
    //print_r($order);
    $appApiParameters = $notify->GetAppApiParameters($order);//生成提交给app的一些参数
    echo $appApiParameters;

WxPay.AppPay.php

APP支付实现类
<?php  
class AppPay  
{    
    /**
     * 
     * 参数数组转换为url参数
     * @param array $urlObj
     */
    private function ToUrlParams($urlObj)
    {
        $buff = "";
        foreach ($urlObj as $k => $v)
        {
            $buff .= $k . "=" . $v . "&";
        }

        $buff = trim($buff, "&");
        return $buff;
    }

    /**
     * 
     * 生成直接支付url,支付url有效期为2小时,模式二
     * @param UnifiedOrderInput $input
     */
    public function GetPayPrepayId($input)
    {
        if($input->GetTrade_type()=="APP")
        {
            $result = WxPayApi::unifiedOrder($input);
            return $result;
        }
    }
    /*生成APP提交数据*/
    public function GetAppApiParameters($UnifiedOrderResult)
    {
        if(!array_key_exists("appid", $UnifiedOrderResult)
        || !array_key_exists("prepay_id", $UnifiedOrderResult)
        || $UnifiedOrderResult['prepay_id'] == "")
        {
            throw new WxPayException("参数错误");
        }
        $appapi = new WxPayAppApiPay();
        $appapi->SetAppid($UnifiedOrderResult["appid"]);
        $appapi->SetPartnerId($UnifiedOrderResult["mch_id"]);
        $appapi->SetPrepayId($UnifiedOrderResult["prepay_id"]);
        $timeStamp = time();
        $appapi->SetTimeStamp($timeStamp);
        $appapi->SetNonceStr(WxPayApi::getNonceStr());
        $appapi->SetPackage("Sign=WXPay");
        $appapi->SetSign($appapi->MakeSign());
        $back_arr=$appapi->GetValues();
        $back_arr['prepay_id']=$UnifiedOrderResult["prepay_id"];
        $parameters = json_encode($appapi->GetValues());
        return $parameters;
    }
}

在官方的WxPay.Data.php文件中增加提交APP输入对象:

class WxPayAppApiPay extends WxPayDataBase  
{
    /**
    * 设置微信分配的公众账号ID
    * @param string $value 
    **/
    public function SetAppid($value)
    {
        $this->values['appid'] = $value;
    }
    /**
    * 获取微信分配的公众账号ID的值
    * @return 值
    **/
    public function GetAppid()
    {
        return $this->values['appid'];
    }
    /**
    * 判断微信分配的公众账号ID是否存在
    * @return true 或 false
    **/
    public function IsAppidSet()
    {
        return array_key_exists('appid', $this->values);
    }


    /**
    * 设置微信支付分配的prepayid
    * @param string $value 
    **/
    public function SetPrepayId($value)
    {
        $this->values['prepayid'] = $value;
    }
    /**
    * 获取微信支付分配的prepayid的值
    * @return 值
    **/
    public function GetPrepayId()
    {
        return $this->values['prepayid'];
    }
    /**
    * 判断微信支付分配的prepayid是否存在
    * @return true 或 false
    **/
    public function IsPrepayIdSet()
    {
        return array_key_exists('prepayid', $this->values);
    }


    /**
    * 设置微信支付分配的partnerid
    * @param string $value 
    **/
    public function SetPartnerId($value)
    {
        $this->values['partnerid'] = $value;
    }
    /**
    * 获取微信支付分配的partnerid的值
    * @return 值
    **/
    public function GetPartnerId()
    {
        return $this->values['partnerid'];
    }
    /**
    * 判断微信支付分配的partnerid是否存在
    * @return true 或 false
    **/
    public function IsPartnerIdSet()
    {
        return array_key_exists('partnerid', $this->values);
    }

    /**
    * 设置支付时间戳
    * @param string $value 
    **/
    public function SetTimeStamp($value)
    {
        $this->values['timestamp'] = $value;
    }
    /**
    * 获取支付时间戳的值
    * @return 值
    **/
    public function GetTimeStamp()
    {
        return $this->values['timestamp'];
    }
    /**
    * 判断支付时间戳是否存在
    * @return true 或 false
    **/
    public function IsTimeStampSet()
    {
        return array_key_exists('timestamp', $this->values);
    }

    /**
    * 随机字符串
    * @param string $value 
    **/
    public function SetNonceStr($value)
    {
        $this->values['noncestr'] = $value;
    }
    /**
    * 获取notify随机字符串值
    * @return 值
    **/
    public function GetReturn_code()
    {
        return $this->values['noncestr'];
    }
    /**
    * 判断随机字符串是否存在
    * @return true 或 false
    **/
    public function IsReturn_codeSet()
    {
        return array_key_exists('noncestr', $this->values);
    }


    /**
    * 设置订单详情扩展字符串
    * @param string $value 
    **/
    public function SetPackage($value)
    {
        $this->values['package'] = $value;
    }
    /**
    * 获取订单详情扩展字符串的值
    * @return 值
    **/
    public function GetPackage()
    {
        return $this->values['package'];
    }
    /**
    * 判断订单详情扩展字符串是否存在
    * @return true 或 false
    **/
    public function IsPackageSet()
    {
        return array_key_exists('package', $this->values);
    }

    /**
    * 设置签名
    * @param string $value 
    **/
    /*public function SetSign($value)
    {
        $this->values['sign'] = $value;
    }*/
    /**
    * 获取签名
    * @return 值
    **/
    public function GetSign()
    {
        return $this->values['sign'];
    }
    /**
    * 判断签名是否存在
    * @return true 或 false
    **/
    public function IsSignSet()
    {
        return array_key_exists('sign', $this->values);
    }
}