>php教程 >php手册 >WeChat 웹 클라이언트가 결제 QR 코드를 생성합니다.

WeChat 웹 클라이언트가 결제 QR 코드를 생성합니다.

WBOY
WBOY원래의
2016-10-15 10:31:462252검색

QR 코드 획득 권한 카테고리:

<?<span style="color: #000000;">php
</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
 * Trade类
 * @author xyyphp
 * @date 2016/10/10
 </span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">abstract</span> <span style="color: #0000ff;">class</span> TradeController <span style="color: #0000ff;">extends</span><span style="color: #000000;"> BaseController
{
        </span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$mchid</span><span style="color: #000000;">;
    </span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$appid</span><span style="color: #000000;">;
    </span><span style="color: #0000ff;">protected</span> <span style="color: #800080;">$key</span><span style="color: #000000;">;
    
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> init()
    {
            parent</span>::<span style="color: #000000;">init();
            </span><span style="color: #800080;">$this</span>->mchid = WX_MCHID; <span style="color: #008000;">//</span><span style="color: #008000;"> 微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送</span>
            <span style="color: #800080;">$this</span>->appid = WX_APPID; <span style="color: #008000;">//</span><span style="color: #008000;">公众号APPID 通过微信支付商户资料审核后邮件发送</span>
            <span style="color: #800080;">$this</span>-><span style="color: #008080;">key</span> = WX_APIKEY;   <span style="color: #008000;">//</span><span style="color: #008000;">https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥</span>
<span style="color: #000000;">    }
    
    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
    * @param string $openid 调用【网页授权获取用户信息】接口获取到用户在该公众号下的Openid
    * @param float $totalFee 收款总费用 单位元
    * @param string $outTradeNo 唯一的订单号
    * @param string $orderName 订单名称
    * @param string $notifyUrl 支付结果通知url 不要有问号
    * https://mp.weixin.qq.com/ 微信支付-开发配置-测试目录
    * 测试目录 http://mp.izhanlue.com/paytest/  最后需要斜线,(需要精确到二级或三级目录)
    * @return string
    </span><span style="color: #008000;">*/</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> createJsBizPackage(<span style="color: #800080;">$totalFee</span>, <span style="color: #800080;">$outTradeNo</span>, <span style="color: #800080;">$orderName</span>, <span style="color: #800080;">$notifyUrl</span>, <span style="color: #800080;">$timestamp</span><span style="color: #000000;">)
    {
        </span><span style="color: #800080;">$config</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">(
                    </span>'mch_id' => <span style="color: #800080;">$this</span>->mchid,
                    'appid' => <span style="color: #800080;">$this</span>->appid,
                    'key' => <span style="color: #800080;">$this</span>-><span style="color: #008080;">key</span>,<span style="color: #000000;">
        );
        </span><span style="color: #800080;">$unified</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">(
            </span>'appid' => <span style="color: #800080;">$config</span>['appid'],
            'attach' => '支付',             <span style="color: #008000;">//</span><span style="color: #008000;">商家数据包,原样返回</span>
            'body' => <span style="color: #800080;">$orderName</span>,
            'mch_id' => <span style="color: #800080;">$config</span>['mch_id'],
            'nonce_str' => <span style="color: #800080;">$this</span>->createNonceStr(),
            'notify_url' => <span style="color: #800080;">$notifyUrl</span>,
            <span style="color: #008000;">//</span><span style="color: #008000;">'openid' => $openid,            //rade_type=JSAPI,此参数必传</span>
            'out_trade_no' => <span style="color: #800080;">$outTradeNo</span>,
            'spbill_create_ip' => '127.0.0.1',
            'total_fee' => <span style="color: #008080;">intval</span>(<span style="color: #800080;">$totalFee</span> * 100),       <span style="color: #008000;">//</span><span style="color: #008000;">单位 转为分</span>
            'trade_type' => 'NATIVE',<span style="color: #000000;">
        );
        </span><span style="color: #800080;">$unified</span>['sign'] = <span style="color: #800080;">$this</span>->getSign(<span style="color: #800080;">$unified</span>, <span style="color: #800080;">$config</span>['key'<span style="color: #000000;">]);
        </span><span style="color: #800080;">$responseXml</span> = <span style="color: #800080;">$this</span>->curlPost('https://api.mch.weixin.qq.com/pay/unifiedorder', <span style="color: #800080;">$this</span>->arrayToXml(<span style="color: #800080;">$unified</span><span style="color: #000000;">));
        </span><span style="color: #008000;">/*</span><span style="color: #008000;">
        <xml>
        <return_code><![CDATA[SUCCESS]]></return_code>
        <return_msg><![CDATA[OK]]></return_msg>
        <appid><![CDATA[wx00e5904efec77699]]></appid>
        <mch_id><![CDATA[1220647301]]></mch_id>
        <nonce_str><![CDATA[1LHBROsdmqfXoWQR]]></nonce_str>
        <sign><![CDATA[ACA7BC8A9164D1FBED06C7DFC13EC839]]></sign>
        <result_code><![CDATA[SUCCESS]]></result_code>
        <prepay_id><![CDATA[wx2015032016590503f1bcd9c30421762652]]></prepay_id>
        <trade_type><![CDATA[JSAPI]]></trade_type>
        </xml>
        </span><span style="color: #008000;">*/</span>
        <span style="color: #800080;">$unifiedOrder</span> = <span style="color: #008080;">simplexml_load_string</span>(<span style="color: #800080;">$responseXml</span>, 'SimpleXMLElement',<span style="color: #000000;"> LIBXML_NOCDATA);
        </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$unifiedOrder</span> === <span style="color: #0000ff;">false</span><span style="color: #000000;">) {
            </span><span style="color: #0000ff;">die</span>('parse xml error'<span style="color: #000000;">);
        }
        </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$unifiedOrder</span>->return_code != 'SUCCESS'<span style="color: #000000;">) {
            </span><span style="color: #0000ff;">die</span>(<span style="color: #800080;">$unifiedOrder</span>-><span style="color: #000000;">return_msg);
        }
        </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$unifiedOrder</span>->result_code != 'SUCCESS'<span style="color: #000000;">) {
            </span><span style="color: #0000ff;">die</span>(<span style="color: #800080;">$unifiedOrder</span>-><span style="color: #000000;">err_code);
            </span><span style="color: #008000;">/*</span><span style="color: #008000;">
            NOAUTH 商户无此接口权限
            NOTENOUGH 余额不足
            ORDERPAID 商户订单已支付
            ORDERCLOSED 订单已关闭
            SYSTEMERROR 系统错误
            APPID_NOT_EXIST   APPID不存在
            MCHID_NOT_EXIST MCHID不存在
            APPID_MCHID_NOT_MATCH appid和mch_id不匹配
            LACK_PARAMS 缺少参数
            OUT_TRADE_NO_USED 商户订单号重复
            SIGNERROR 签名错误
            XML_FORMAT_ERROR XML格式错误
            REQUIRE_POST_METHOD 请使用post方法
            POST_DATA_EMPTY post数据为空
            NOT_UTF8 编码格式错误
            </span><span style="color: #008000;">*/</span><span style="color: #000000;">
        }
        </span><span style="color: #008000;">//</span><span style="color: #008000;">$unifiedOrder->trade_type 交易类型 调用接口提交的交易类型,取值如下:JSAPI,NATIVE,APP
        //$unifiedOrder->prepay_id 预支付交易会话标识 微信生成的预支付回话标识,用于后续接口调用中使用,该值有效期为2小时
        //$unifiedOrder->code_url 二维码链接 trade_type为NATIVE是有返回,可将该参数值生成二维码展示出来进行扫码支付</span>
                <span style="color: #800080;">$code_list</span> = (<span style="color: #0000ff;">array</span>)<span style="color: #800080;">$unifiedOrder</span>-><span style="color: #000000;">code_url;
        </span><span style="color: #800080;">$arr</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">(
            </span>"appId" => <span style="color: #800080;">$config</span>['appid'],
            "timeStamp" => <span style="color: #800080;">$timestamp</span>,
            "nonceStr" => <span style="color: #800080;">$this</span>->createNonceStr(),
            "package" => "prepay_id=" . <span style="color: #800080;">$unifiedOrder</span>->prepay_id,
            "signType" => 'MD5',
                        "code_url" => <span style="color: #800080;">$code_list</span>[0<span style="color: #000000;">]
        );
        </span><span style="color: #800080;">$arr</span>['paySign'] = <span style="color: #800080;">$this</span>->getSign(<span style="color: #800080;">$arr</span>, <span style="color: #800080;">$config</span>['key'<span style="color: #000000;">]);
        </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$arr</span><span style="color: #000000;">;
    }
        
        </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
         * 查询订单
    </span><span style="color: #008000;">*/</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> orderQuery(<span style="color: #800080;">$outTradeNo</span><span style="color: #000000;">)
    {
        </span><span style="color: #800080;">$config</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">(
                    </span>'mch_id' => <span style="color: #800080;">$this</span>->mchid,
                    'appid' => <span style="color: #800080;">$this</span>->appid,
                    'key' => <span style="color: #800080;">$this</span>-><span style="color: #008080;">key</span>,<span style="color: #000000;">
        );
        </span><span style="color: #800080;">$unified</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">(
            </span>'appid' => <span style="color: #800080;">$config</span>['appid'],
            'mch_id' => <span style="color: #800080;">$config</span>['mch_id'],
            'out_trade_no' => <span style="color: #800080;">$outTradeNo</span>,
                        'nonce_str' => <span style="color: #800080;">$this</span>-><span style="color: #000000;">createNonceStr()
        );
        </span><span style="color: #800080;">$unified</span>['sign'] = <span style="color: #800080;">$this</span>->getSign(<span style="color: #800080;">$unified</span>, <span style="color: #800080;">$config</span>['key'<span style="color: #000000;">]);
        </span><span style="color: #800080;">$responseXml</span> = <span style="color: #800080;">$this</span>->curlPost('https://api.mch.weixin.qq.com/pay/orderquery', <span style="color: #800080;">$this</span>->arrayToXml(<span style="color: #800080;">$unified</span><span style="color: #000000;">));
        </span><span style="color: #008000;">/*</span><span style="color: #008000;">
        <xml><return_code><![CDATA[SUCCESS]]></return_code>
                <return_msg><![CDATA[OK]]></return_msg>
                <appid><![CDATA[wx406c5455be1a2590]]></appid>
                <mch_id><![CDATA[1398638602]]></mch_id>
                <nonce_str><![CDATA[ousUeAEvH6KlDiGe]]></nonce_str>
                <sign><![CDATA[D8BFB54A52C324238D5A4BA8C8BC6D01]]></sign>
                <result_code><![CDATA[SUCCESS]]></result_code>
                <out_trade_no><![CDATA[1476157452]]></out_trade_no>
                <trade_state><![CDATA[NOTPAY]]></trade_state>
                <trade_state_desc><![CDATA[订单未支付]]></trade_state_desc>
                </xml>
        </span><span style="color: #008000;">*/</span>
        <span style="color: #800080;">$unifiedOrder</span> = <span style="color: #008080;">simplexml_load_string</span>(<span style="color: #800080;">$responseXml</span>, 'SimpleXMLElement',<span style="color: #000000;"> LIBXML_NOCDATA);
        </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$unifiedOrder</span> === <span style="color: #0000ff;">false</span><span style="color: #000000;">) {
            </span><span style="color: #0000ff;">die</span>('parse xml error'<span style="color: #000000;">);
        }
        </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$unifiedOrder</span>->return_code != 'SUCCESS'<span style="color: #000000;">) {
            </span><span style="color: #0000ff;">die</span>(<span style="color: #800080;">$unifiedOrder</span>-><span style="color: #000000;">return_msg);
        }
        </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$unifiedOrder</span>->result_code != 'SUCCESS'<span style="color: #000000;">) {
            </span><span style="color: #0000ff;">die</span>(<span style="color: #800080;">$unifiedOrder</span>-><span style="color: #000000;">err_code);
            </span><span style="color: #008000;">/*</span><span style="color: #008000;">
            NOAUTH 商户无此接口权限
            NOTENOUGH 余额不足
            ORDERPAID 商户订单已支付
            ORDERCLOSED 订单已关闭
            SYSTEMERROR 系统错误
            APPID_NOT_EXIST   APPID不存在
            MCHID_NOT_EXIST MCHID不存在
            APPID_MCHID_NOT_MATCH appid和mch_id不匹配
            LACK_PARAMS 缺少参数
            OUT_TRADE_NO_USED 商户订单号重复
            SIGNERROR 签名错误
            XML_FORMAT_ERROR XML格式错误
            REQUIRE_POST_METHOD 请使用post方法
            POST_DATA_EMPTY post数据为空
            NOT_UTF8 编码格式错误
            </span><span style="color: #008000;">*/</span><span style="color: #000000;">
        }
        </span><span style="color: #008000;">//</span><span style="color: #008000;">$unifiedOrder->trade_type 交易类型 调用接口提交的交易类型,取值如下:JSAPI,NATIVE,APP
        //$unifiedOrder->prepay_id 预支付交易会话标识 微信生成的预支付回话标识,用于后续接口调用中使用,该值有效期为2小时
        //$unifiedOrder->code_url 二维码链接 trade_type为NATIVE是有返回,可将该参数值生成二维码展示出来进行扫码支付</span>
                <span style="color: #008000;">/*</span><span style="color: #008000;">
                public 'return_code' => string 'SUCCESS' (length=7)
                public 'return_msg' => string 'OK' (length=2)
                public 'appid' => string 'wx406c5455be1a2590' (length=18)
                public 'mch_id' => string '1398638602' (length=10)
                public 'nonce_str' => string 'lyt2ZGFeE9G0DI4W' (length=16)
                public 'sign' => string 'F942BB644E72FE29936C80E6780D8D8A' (length=32)
                public 'result_code' => string 'SUCCESS' (length=7)
                public 'out_trade_no' => string '1476157452' (length=10)
                public 'trade_state' => string 'NOTPAY' (length=6)
                public 'trade_state_desc' => string '订单未支付' (length=15)
                </span><span style="color: #008000;">*/</span>
                <span style="color: #008000;">//</span><span style="color: #008000;">已结支付</span>
                <span style="color: #008000;">/*</span><span style="color: #008000;">
                object(SimpleXMLElement)[26]
                    public 'return_code' => string 'SUCCESS' (length=7)
                    public 'return_msg' => string 'OK' (length=2)
                    public 'appid' => string 'wx406c5455be1a2590' (length=18)
                    public 'mch_id' => string '1398638602' (length=10)
                    public 'nonce_str' => string '6cFpzNc5BTyZ02x0' (length=16)
                    public 'sign' => string 'F01C79BD0FC4BC4FE38231BA92A91201' (length=32)
                    public 'result_code' => string 'SUCCESS' (length=7)
                    public 'openid' => string 'ojIdvuCVrweMrgaU-dFobIItTtpk' (length=28)
                    public 'is_subscribe' => string 'N' (length=1)
                    public 'trade_type' => string 'NATIVE' (length=6)
                    public 'bank_type' => string 'CFT' (length=3)
                    public 'total_fee' => string '1' (length=1)
                    public 'fee_type' => string 'CNY' (length=3)
                    public 'transaction_id' => string '4001652001201610116386495939' (length=28)
                    public 'out_trade_no' => string '1476161468' (length=10)
                    public 'attach' => string '支付' (length=6)
                    public 'time_end' => string '20161011125205' (length=14)
                    public 'trade_state' => string 'SUCCESS' (length=7)
                    public 'cash_fee' => string '1' (length=1)
                 </span><span style="color: #008000;">*/</span>
                <span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$unifiedOrder</span>-><span style="color: #000000;">trade_state_desc)){
                    </span><span style="color: #800080;">$msg</span> = "订单未支付"<span style="color: #000000;">;
                }
                </span><span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$unifiedOrder</span>-><span style="color: #000000;">transaction_id)){
                    </span><span style="color: #800080;">$msg</span> = "已支付"<span style="color: #000000;">;
                }
                </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$msg</span><span style="color: #000000;">;
    }
    
    
    </span><span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> notify()
    {
        </span><span style="color: #800080;">$config</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">(
                    </span>'mch_id' => <span style="color: #800080;">$this</span>->mchid,
                    'appid' => <span style="color: #800080;">$this</span>->appid,
                    'key' => <span style="color: #800080;">$this</span>-><span style="color: #008080;">key</span>,<span style="color: #000000;">
        );
        </span><span style="color: #800080;">$postStr</span> = <span style="color: #800080;">$GLOBALS</span>["HTTP_RAW_POST_DATA"<span style="color: #000000;">];
        </span><span style="color: #008000;">/*</span><span style="color: #008000;">
        $postStr = '<xml>
        <appid><![CDATA[wx00e5904efec77699]]></appid>
        <attach><![CDATA[支付测试]]></attach>
        <bank_type><![CDATA[CMB_CREDIT]]></bank_type>
        <cash_fee><![CDATA[1]]></cash_fee>
        <fee_type><![CDATA[CNY]]></fee_type>
        <is_subscribe><![CDATA[Y]]></is_subscribe>
        <mch_id><![CDATA[1220647301]]></mch_id>
        <nonce_str><![CDATA[a0tZ41phiHm8zfmO]]></nonce_str>
        <openid><![CDATA[oU3OCt5O46PumN7IE87WcoYZY9r0]]></openid>
        <out_trade_no><![CDATA[550bf2990c51f]]></out_trade_no>
        <result_code><![CDATA[SUCCESS]]></result_code>
        <return_code><![CDATA[SUCCESS]]></return_code>
        <sign><![CDATA[F6F519B4DD8DB978040F8C866C1E6250]]></sign>
        <time_end><![CDATA[20150320181606]]></time_end>
        <total_fee>1</total_fee>
        <trade_type><![CDATA[JSAPI]]></trade_type>
        <transaction_id><![CDATA[1008840847201503200034663980]]></transaction_id>
        </xml>';
        </span><span style="color: #008000;">*/</span>
        <span style="color: #800080;">$postObj</span> = <span style="color: #008080;">simplexml_load_string</span>(<span style="color: #800080;">$postStr</span>, 'SimpleXMLElement',<span style="color: #000000;"> LIBXML_NOCDATA);
        </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$postObj</span> === <span style="color: #0000ff;">false</span><span style="color: #000000;">) {
            </span><span style="color: #0000ff;">die</span>('parse xml error'<span style="color: #000000;">);
        }
        </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$postObj</span>->return_code != 'SUCCESS'<span style="color: #000000;">) {
            </span><span style="color: #0000ff;">die</span>(<span style="color: #800080;">$postObj</span>-><span style="color: #000000;">return_msg);
        }
        </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$postObj</span>->result_code != 'SUCCESS'<span style="color: #000000;">) {
            </span><span style="color: #0000ff;">die</span>(<span style="color: #800080;">$postObj</span>-><span style="color: #000000;">err_code);
        }
        </span><span style="color: #800080;">$arr</span> = (<span style="color: #0000ff;">array</span>)<span style="color: #800080;">$postObj</span><span style="color: #000000;">;
        </span><span style="color: #0000ff;">unset</span>(<span style="color: #800080;">$arr</span>['sign'<span style="color: #000000;">]);
        </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$this</span>->getSign(<span style="color: #800080;">$arr</span>, <span style="color: #800080;">$config</span>['key']) == <span style="color: #800080;">$postObj</span>-><span style="color: #000000;">sign) {
            </span><span style="color: #008000;">//</span><span style="color: #008000;"> $mch_id = $postObj->mch_id; //微信支付分配的商户号
            // $appid = $postObj->appid; //微信分配的公众账号ID
            // $openid = $postObj->openid; //用户在商户appid下的唯一标识
            // $transaction_id = $postObj->transaction_id;//微信支付订单号
            // $out_trade_no = $postObj->out_trade_no;//商户订单号
            // $total_fee = $postObj->total_fee; //订单总金额,单位为分
            // $is_subscribe = $postObj->is_subscribe; //用户是否关注公众账号,Y-关注,N-未关注,仅在公众账号类型支付有效
            // $attach = $postObj->attach;//商家数据包,原样返回
            // $time_end = $postObj->time_end;//支付完成时间</span>
            <span style="color: #0000ff;">echo</span> '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>'<span style="color: #000000;">;
            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$postObj</span><span style="color: #000000;">;
        }
    }
    
    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
    * curl get
    * @param string $url
    * @param array $options
    * @return mixed
    </span><span style="color: #008000;">*/</span>
       <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> curlGet(<span style="color: #800080;">$url</span> = '', <span style="color: #800080;">$options</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">())
    {
        </span><span style="color: #800080;">$ch</span> = curl_init(<span style="color: #800080;">$url</span><span style="color: #000000;">);
        curl_setopt(</span><span style="color: #800080;">$ch</span>, CURLOPT_RETURNTRANSFER, 1<span style="color: #000000;">);
        curl_setopt(</span><span style="color: #800080;">$ch</span>, CURLOPT_TIMEOUT, 30<span style="color: #000000;">);
        </span><span style="color: #0000ff;">if</span> (!<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$options</span><span style="color: #000000;">)) {
            curl_setopt_array(</span><span style="color: #800080;">$ch</span>, <span style="color: #800080;">$options</span><span style="color: #000000;">);
        }
        </span><span style="color: #008000;">//</span><span style="color: #008000;">https请求 不验证证书和host</span>
        curl_setopt(<span style="color: #800080;">$ch</span>, CURLOPT_SSL_VERIFYPEER, <span style="color: #0000ff;">false</span><span style="color: #000000;">);
        curl_setopt(</span><span style="color: #800080;">$ch</span>, CURLOPT_SSL_VERIFYHOST, <span style="color: #0000ff;">false</span><span style="color: #000000;">);
        </span><span style="color: #800080;">$data</span> = curl_exec(<span style="color: #800080;">$ch</span><span style="color: #000000;">);
        curl_close(</span><span style="color: #800080;">$ch</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$data</span><span style="color: #000000;">;
    }
    
    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
    * curl post
    * @param string $url
    * @param array $options
    * @return mixed
    </span><span style="color: #008000;">*/</span>
       <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> curlPost(<span style="color: #800080;">$url</span> = '', <span style="color: #800080;">$postData</span> = '', <span style="color: #800080;">$options</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">())
    {
        </span><span style="color: #0000ff;">if</span> (<span style="color: #008080;">is_array</span>(<span style="color: #800080;">$postData</span><span style="color: #000000;">)) {
            </span><span style="color: #800080;">$postData</span> = <span style="color: #008080;">http_build_query</span>(<span style="color: #800080;">$postData</span><span style="color: #000000;">);
        }
        </span><span style="color: #800080;">$ch</span> =<span style="color: #000000;"> curl_init();
        curl_setopt(</span><span style="color: #800080;">$ch</span>, CURLOPT_URL, <span style="color: #800080;">$url</span><span style="color: #000000;">);
        curl_setopt(</span><span style="color: #800080;">$ch</span>, CURLOPT_RETURNTRANSFER, 1<span style="color: #000000;">);
        curl_setopt(</span><span style="color: #800080;">$ch</span>, CURLOPT_POST, 1<span style="color: #000000;">);
        curl_setopt(</span><span style="color: #800080;">$ch</span>, CURLOPT_POSTFIELDS, <span style="color: #800080;">$postData</span><span style="color: #000000;">);
        curl_setopt(</span><span style="color: #800080;">$ch</span>, CURLOPT_TIMEOUT, 30); <span style="color: #008000;">//</span><span style="color: #008000;">设置cURL允许执行的最长秒数</span>
        <span style="color: #0000ff;">if</span> (!<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$options</span><span style="color: #000000;">)) {
            curl_setopt_array(</span><span style="color: #800080;">$ch</span>, <span style="color: #800080;">$options</span><span style="color: #000000;">);
        }
        </span><span style="color: #008000;">//</span><span style="color: #008000;">https请求 不验证证书和host</span>
        curl_setopt(<span style="color: #800080;">$ch</span>, CURLOPT_SSL_VERIFYPEER, <span style="color: #0000ff;">false</span><span style="color: #000000;">);
        curl_setopt(</span><span style="color: #800080;">$ch</span>, CURLOPT_SSL_VERIFYHOST, <span style="color: #0000ff;">false</span><span style="color: #000000;">);
        </span><span style="color: #800080;">$data</span> = curl_exec(<span style="color: #800080;">$ch</span><span style="color: #000000;">);
        curl_close(</span><span style="color: #800080;">$ch</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$data</span><span style="color: #000000;">;
    }
    
    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
    * 随机生成一定长度字符串
    * @param string $url
    * @param array $options
    * @return mixed
    </span><span style="color: #008000;">*/</span>
       <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> createNonceStr(<span style="color: #800080;">$length</span> = 16<span style="color: #000000;">)
    {
        </span><span style="color: #800080;">$chars</span> = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'<span style="color: #000000;">;
        </span><span style="color: #800080;">$str</span> = ''<span style="color: #000000;">;
        </span><span style="color: #0000ff;">for</span> (<span style="color: #800080;">$i</span> = 0; <span style="color: #800080;">$i</span> < <span style="color: #800080;">$length</span>; <span style="color: #800080;">$i</span>++<span style="color: #000000;">) {
            </span><span style="color: #800080;">$str</span> .= <span style="color: #008080;">substr</span>(<span style="color: #800080;">$chars</span>, <span style="color: #008080;">mt_rand</span>(0, <span style="color: #008080;">strlen</span>(<span style="color: #800080;">$chars</span>) - 1), 1<span style="color: #000000;">);
        }
        </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$str</span><span style="color: #000000;">;
    }
    
    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
    * 数组转成XML
    * @param string $url
    * @param array $options
    * @return mixed
    </span><span style="color: #008000;">*/</span>
       <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> arrayToXml(<span style="color: #800080;">$arr</span><span style="color: #000000;">)
    {
        </span><span style="color: #800080;">$xml</span> = "<xml>"<span style="color: #000000;">;
        </span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$arr</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$key</span> => <span style="color: #800080;">$val</span><span style="color: #000000;">) {
            </span><span style="color: #0000ff;">if</span> (<span style="color: #008080;">is_numeric</span>(<span style="color: #800080;">$val</span><span style="color: #000000;">)) {
            </span><span style="color: #800080;">$xml</span> .= "<" . <span style="color: #800080;">$key</span> . ">" . <span style="color: #800080;">$val</span> . "</" . <span style="color: #800080;">$key</span> . ">"<span style="color: #000000;">;
        } </span><span style="color: #0000ff;">else</span>
            <span style="color: #800080;">$xml</span> .= "<" . <span style="color: #800080;">$key</span> . "><![CDATA[" . <span style="color: #800080;">$val</span> . "]]></" . <span style="color: #800080;">$key</span> . ">"<span style="color: #000000;">;
        }
        </span><span style="color: #800080;">$xml</span> .= "</xml>"<span style="color: #000000;">;
        </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$xml</span><span style="color: #000000;">;
    }

    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
    * 例如:
    * appid:  wxd930ea5d5a258f4f
    * mch_id:  10000100
    * device_info: 1000
    * Body:  test
    * nonce_str: ibuaiVcKdpRxkhJA
    * 第一步:对参数按照 key=value 的格式,并按照参数名 ASCII 字典序排序如下:
    * stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_i
    * d=10000100&nonce_str=ibuaiVcKdpRxkhJA";
    * 第二步:拼接支付密钥:
    * stringSignTemp="stringA&key=192006250b4c09247ec02edce69f6a2d"
    * sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7"
    </span><span style="color: #008000;">*/</span>
       <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> getSign(<span style="color: #800080;">$params</span>, <span style="color: #800080;">$key</span><span style="color: #000000;">)
    {
        </span><span style="color: #008080;">ksort</span>(<span style="color: #800080;">$params</span>,<span style="color: #000000;"> SORT_STRING);
        </span><span style="color: #800080;">$unSignParaString</span> = <span style="color: #800080;">$this</span>->formatQueryParaMap(<span style="color: #800080;">$params</span>, <span style="color: #0000ff;">false</span><span style="color: #000000;">);
        </span><span style="color: #800080;">$signStr</span> = <span style="color: #008080;">strtoupper</span>(<span style="color: #008080;">md5</span>(<span style="color: #800080;">$unSignParaString</span> . "&key=" . <span style="color: #800080;">$key</span><span style="color: #000000;">));
        </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$signStr</span><span style="color: #000000;">;
    }
    
    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
    * 签名时字符组合
    * @param string $url
    * @param array $options
    * @return mixed
    </span><span style="color: #008000;">*/</span>
       <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> formatQueryParaMap(<span style="color: #800080;">$paraMap</span>, <span style="color: #800080;">$urlEncode</span> = <span style="color: #0000ff;">false</span><span style="color: #000000;">)
    {
        </span><span style="color: #800080;">$buff</span> = ""<span style="color: #000000;">;
        </span><span style="color: #008080;">ksort</span>(<span style="color: #800080;">$paraMap</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$paraMap</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$k</span> => <span style="color: #800080;">$v</span><span style="color: #000000;">) {
            </span><span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">null</span> != <span style="color: #800080;">$v</span> && "null" != <span style="color: #800080;">$v</span><span style="color: #000000;">) {
                </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$urlEncode</span><span style="color: #000000;">) {
                    </span><span style="color: #800080;">$v</span> = <span style="color: #008080;">urlencode</span>(<span style="color: #800080;">$v</span><span style="color: #000000;">);
                }
                </span><span style="color: #800080;">$buff</span> .= <span style="color: #800080;">$k</span> . "=" . <span style="color: #800080;">$v</span> . "&"<span style="color: #000000;">;
            }
        }
        </span><span style="color: #800080;">$reqPar</span> = ''<span style="color: #000000;">;
        </span><span style="color: #0000ff;">if</span> (<span style="color: #008080;">strlen</span>(<span style="color: #800080;">$buff</span>) > 0<span style="color: #000000;">) {
            </span><span style="color: #800080;">$reqPar</span> = <span style="color: #008080;">substr</span>(<span style="color: #800080;">$buff</span>, 0, <span style="color: #008080;">strlen</span>(<span style="color: #800080;">$buff</span>) - 1<span style="color: #000000;">);
        }
        </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$reqPar</span><span style="color: #000000;">;
    }
}</span>

인스턴스 검색:

<span style="color: #800080;">$money</span> = 0.1;<span style="color: #008000;">//</span><span style="color: #008000;">订单金额</span>
<span style="color: #800080;">$out_trade_no</span> = 'test_8888888';<span style="color: #008000;">//</span><span style="color: #008000;">唯一的订单号</span>
<span style="color: #800080;">$order_name</span> = '测试订单';<span style="color: #008000;">//</span><span style="color: #008000;">订单名称</span>
<span style="color: #800080;">$notifyUrl</span> = 'http://www.test.com/';<span style="color: #008000;">//</span><span style="color: #008000;">支付结果通知url 不要有问号</span>
<span style="color: #800080;">$timeStamp</span> = <span style="color: #008080;">time</span>();<span style="color: #008000;">//</span><span style="color: #008000;">时间戳

//获取二维码信息</span>
<span style="color: #800080;">$wx_result</span> = <span style="color: #800080;">$this</span>->createJsBizPackage(<span style="color: #800080;">$money</span>, <span style="color: #800080;">$out_trade_no</span>, <span style="color: #800080;">$order_name</span>, <span style="color: #800080;">$notifyUrl</span>, <span style="color: #800080;">$timeStamp</span><span style="color: #000000;">);

</span><span style="color: #008000;">//</span><span style="color: #008000;">检测支付状态</span>
<span style="color: #800080;">$str_status</span> = <span style="color: #800080;">$this</span>->orderQuery(<span style="color: #800080;">$out_trade_no</span>);

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.