function notify_callback($config, $get, $raw_post)
{
    $cache = get_cache();
    try {
        $gateway = new \Omnipay\Wechat\ExpressGateway();
        $gateway->setAppId($config['app_id']);
        $gateway->setKey($config['pay_sign_key']);
        $gateway->setPartner($config['partner']);
        $gateway->setPartnerKey($config['partner_key']);
        $cache->save(LAST_NOTIFY_CACHE_KEY, func_get_args());
        $response = $gateway->completePurchase(array('request_params' => $get, 'body' => $raw_post))->send();
        if ($response->isSuccessful() && $response->isTradeStatusOk()) {
            //todo success
            $serial = $cache->fetch($get['out_trade_no']);
            $serial['notify'] = array('status' => 'success', 'param' => http_build_query($get), 'body' => $raw_post);
            $data = json_decode(json_encode(simplexml_load_string($raw_post, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
            $cache->save($get['out_trade_no'], $serial);
            $cache->save(LAST_NOTIFY_CACHE_KEY, array('param' => http_build_query($get), 'body' => $raw_post, 'data' => $data, 'status' => $response->getMessage()));
            $cache->delete(LAST_ERROR_CACHE_KEY);
            die($response->getMessage());
            //            die('success');
        } else {
            die($response->getMessage());
        }
    } catch (\Exception $e) {
        $cache->save(LAST_ERROR_CACHE_KEY, $e->getLine() . ': ' . $e->getMessage());
        die('exception: ' . $e->getLine() . ' - ' . $e->getMessage());
    }
}
/**
 * 跳转到支付界面
 * @param $config
 */
function wechat_redirect($config, $type = 'pay')
{
    /*
     * @var Omnipay\Wechat\ExpressGateway
     */
    try {
        //        $gateway = \Omnipay\Omnipay::create('Wechat_Express');
        $gateway = new \Omnipay\Wechat\ExpressGateway();
        $gateway->setAppId($config['app_id']);
        $gateway->setKey($config['pay_sign_key']);
        $gateway->setPartner($config['partner']);
        $gateway->setPartnerKey($config['partner_key']);
        $gateway->setNotifyUrl($config['notify_url']);
        $gateway->setReturnUrl($config['return_url']);
        $gateway->setReturnUrl($config['cancel_url']);
        $gateway->setCertPath($config['cert_path']);
        $gateway->setCertKeyPath($config['cert_key_path']);
        $out_trade_no = $_GET['out_trade_no'];
        $opts = array('open_id' => array_get($config, 'open_id', false), 'subject' => $_GET['subject'], 'description' => '微信无效', 'total_fee' => $_GET['total_fee'], 'out_trade_no' => $out_trade_no);
        if ($type == 'prepay') {
            $res = $gateway->prePurchase(array_add($opts, 'trade_type', 'APP'))->send();
            echo json_encode($res->getTransactionReference());
            exit(0);
        } else {
            $res = $gateway->purchase($opts)->send();
        }
        //        $res = $gateway->prePurchase($opts)->send();
        //        $ret = $res->getTransactionReference();
        //        echo $ret;
        $cache = get_cache();
        $cache->save($out_trade_no, $opts);
        if (!empty($_GET['redirect'])) {
            $res->redirect('js');
        }
        if (!empty($_GET['link'])) {
            $url = $res->getRedirectUrl();
            if (empty($_GET['qr'])) {
                echo "<html>";
                echo "<a href=\"{$url}\">{$url}</a>";
                echo "</html>";
            } else {
                QRcode::png($url);
            }
            die;
        }
        $res->redirect();
    } catch (\Exception $e) {
        var_dump($e->getMessage());
    }
}