专注于高品质PHP技术等信息服务于一体 [STIEMAP] [RSS]

百度提供的广告:
PHP
当前位置:首页 > 技术文档 > PHP >  > 
支付宝新版sdk RQ二维码支付
新版的 sdk 采用 rsa rsa2 加密,不同于之前的 md5 方式,放到自己网站上问题多一些, sdk 要求是 php5.5 经过测试 php 5.4 可以比较好的兼容,5.3 5.2 就有问题了
问题是 json_encode 的时候,输入的第2个参数,在 5.4 之前的版本中是没有这个参数的。

现在想实现,能直接在页面上显示出来,支付的二维码, 用手机支付宝app 一扫就立马能付款,而不是还要跳到支付宝的网页中,可以输入用户名密码登录,或扫码这种。
微信支付实现起来就是非常的容易,微信是直接生成 rq 二维码,即可。

目标是在网站上,左侧显示出来微信的支付二维码,右侧是 支付宝的二维码, 方便不同的用户支付。 经过查询文档,即时到帐有这个功能,需要传入2个参数就可以
qr_pay_mode = 4 ,qrcode_width = 350

但是发现他们提供的 sdk 没有这个功能,强行写到 biz_content 里面也还是有问题, 而且sdk 里面的封装太多,也不利用集成到网站中。

下面介绍一个,生成支付 表单的方法
1, 要输入的参数,使用 正常的 自然排序的方式,决定 key 的顺序
2,将key=val& 拼成一个字符串
3,使用 rsa 私钥加密,得到一个 sgin
4,生成 表单,自动提交

下面给出部分代码
<?php
if(!defined('ROOTPATH')) exit('Request Error!');

class alipayPayment{
    
    private function parms_join($parms)
    {
        $str = '';
        foreach($parms as $key => $parm)
        {
            $str .= "$key=$parm&";
        }
        return substr($str, 0, -1);
    }
    
    //生成 & 验证 sign
    private function sign($parms)
    {
        unset($parms['sign']);
        ksort($parms);
        $priKey = get_config('alipay_private_key');
        $res = "-----BEGIN RSA PRIVATE KEY-----\n" .
        wordwrap($priKey, 64, "\n", true) .
        "\n-----END RSA PRIVATE KEY-----";
        openssl_sign($this->parms_join($parms), $sign, $res);
        return base64_encode($sign);
    }
    function pay($order_id)
    {
        $order = $db->order_model->find($order_id);
        
        $parms = array();
        $parms['app_id']      = get_config('alipay_appid');
        $parms['method']     = 'alipay.trade.page.pay';
        $parms['charset']    = 'UTF-8';
        $parms['sign_type']  = 'RSA';
        $parms['format']     = 'json';
        $parms['timestamp']  = date('Y-m-d H:i:s');
        $parms['version']    = '1.0';
        $parms['alipay_sdk']    = 'qrx-stdio-sdk-php';
        $parms['return_url'] = get_config('alipay_return_url'); 
        $parms['notify_url'] = get_config('alipay_notify_url');
        
        $custom_parms = array();
        $custom_parms['product_code'] = 'FAST_INSTANT_TRADE_PAY';
        $custom_parms['body']         = '';
        $custom_parms['subject']      = get_config('alipay_order_title');
        $custom_parms['total_amount'] = $order['total_price'];
        $custom_parms['out_trade_no'] = $order['order_SN'];
        $custom_parms['qr_pay_mode']  = 4;   //QR码
        $custom_parms['qrcode_width'] = 210; //QR码大小
        
        $parms['biz_content'] = json_encode($custom_parms);//附加业务参数
        $parms['sign']        = $this->sign($parms);
        
        $html = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>支付</title></head><body>';
        $html .= '<form style="display:none" action="https://openapi.alipay.com/gateway.do?charset=UTF-8" name="alipay_form" id="alipay_form" method="POST">';
        foreach($parms as $key => $val)
        {
            $html .= "<input type='text' name='$key' value='$val'>";
        }
        $html .= '<input type="submit" value="submit">';
        $html .= '</form>';
        $html .= '<script type="text/javascript">document.alipay_form.submit()</script>';//自动提交
        return $html.'</body></html>';
}

这样就可以生成一个html 把这个放到 if