美文网首页
H5不用支付宝SDK调起客户端

H5不用支付宝SDK调起客户端

作者: RasonWu | 来源:发表于2018-08-15 16:07 被阅读1254次

    本文主要解决两个问题:1. 搞清楚新旧版本接口 2. 不使用支付宝SDK调起支付宝客户端并成功回调。浏览方式建议先通读全文再细看。

    • 目录
      - 移动支付老版本和APP支付新版本接入对比
      - 关于应用私钥的问题:
      - webview里的支付宝H5链接调起支付宝
      - 不使用支付宝SDK,调起支付宝的方案
      - 新接口(APP支付)拼装调起客户端参数的方案
      - 官方签名工具,强烈推荐
      - 排查错误指南
      - 一些有用的资料

    移动支付老版本和APP支付新版本接入对比

    • 什么是新接口,什么是老接口?当然也可以看上面的链接,就更加全面。
      支付宝的更新迭代,所以产生了两套的接口。老的目前还能用,后面能不能用就不知道了。对于客户端支付相关的产品:老的叫移动支付,就是17年之前的,当然这也包括了后台部分。新的叫app支付,是17年之后的一套接口。所以可以根据大概时间去区分是哪种接口。

    关于应用私钥的问题:

    iOS客户端的话,使用pkcs8格式的应用私钥,后台的话,是java就用pkcs8,其它都用pkcs1格式的。

    webview里的支付宝H5链接调起支付宝

    这是不使用支付宝SDK的方案,老接口版本,支付宝调起客户端的问题:

    • H5如何调起客户端支付宝,并且回调?
    1. 需要先我们用的是老接口还是新接口,对应的H5链接支持才可以。
      若接入的是新版本手机网站支付接口(alipay.trade.wap.pay),用户在安装支付宝钱包的情况下,调用手机网站支付接口默认会唤起钱包支付;若接入的是手机网站支付老版本(alipay.wap.create.direct.pay.by.user ),那么需要在请求参数中加入app_pay参数并赋值为Y,详情参见 手机网站支付老版本文档;37用的是H5链接是老的,所以需要需要加入app_pay为Y的参数。
    2. 在上面支持之后,在我们的webview还是不能直接调起对应的app。我们需要拦截alipay://的请求,并且通过openURL的方式打开对应的app。需要注意白名单的问题。
    3. 最后就是要处理回调的问题,我的方案是在openurl里面处理的,拦截替换对应的参数。
    • 为什么支付宝的demo还是会报错?
    1. 我们首先需要搞清楚,我们的是旧接口,还是新接口。如果你的demo是新的,但是只签约了旧方法,只配置了旧的公私钥,那么当然就会有问题。

    不使用支付宝SDK,调起支付宝的方案

    下面代码可以拼接出直接调起支付宝客户端(老版接口、移动支付)的串,文件需要更换应用私钥、partner、seller_id才可以。生成的iOSLink就是iOS可以直接调起openURL的链接了。

    <?php
    header('Access-Control-Allow-Origin: *');
    header('Content-type: text/plain');
    // 获取支付金额
    $amount='';
    if($_SERVER['REQUEST_METHOD']=='POST'){
        $amount=$_POST['total'];
    }else{
        $amount=$_GET['total'];
    }
    $total = floatval($amount);
    if(!$total){
        $total = 1;
    }
    // 对签名字符串转义
    function createLinkstring($para) {
        $arg  = "";
        while (list ($key, $val) = each ($para)) {
            $arg.=$key.'="'.$val.'"&';
        }
        //去掉最后一个&字符
        $arg = substr($arg,0,count($arg)-2);
        //如果存在转义字符,那么去掉转义
        if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
        return $arg;
    }
    // 签名生成订单信息
    function rsaSign($data) {
        $priKey = "-----BEGIN RSA PRIVATE KEY-----
    MIICXAIBAAKBgQDG5M5JEsQcm24X64POfn+pOOafqfyXxQTH8vZHngeRUu0lAXnW
    xbU7cwK/2xJVqNDjWIko9dfkljsdfkjnqwe+wersdffjfp/7zb9Oa7bYnWxl2Yav
    2sF5/sdfdsnfjklKlsd/flksdjfsldkf/gDbsjMLODcKJKuy1QNoi6eiwIDAQAB
    AoGBAJxBH2s7KDULezehKGB+8w5gHJctNbuKVhI7544mMe3Sx2n+OdkoZBQ7a9qM
    YmAXi1xArykVKLQMS6cutCLLfNLRVcXYmvgMi7oHPaTTYdbCQYtksCM80Qlyywdv
    HVyXIKWrsGIFfXgemn8d/yTkdQKQFJNHHmPiYxHg9u/sdE4ZAkEA6a/vH6vzSJSp
    9evtLvlBqNPtEOu1SEiHhsou4wUoqLC+RBpAW4SQkXRuIYBg/z/icZbAB2PIEyMp
    EUMR8Zvf5wJBANniaF7s9aRVBhAhuGnZcqN4BT14/qJ2IbCiAZRmWD23hyCqT8u4
    ZOGSCCjxm7A2278pm6d9LEOpaBUzj1XNB70CQE4q/Y/Ykr56jAeo7WPDGMWCblA0
    qCUPrdXWl6x0s08KH/rj1RdH1pvxGD24hbmcAwD/7ia0H97W6gvOJZhuDY0CQAVe
    hfHo5vjAu6CEJDY/jIqot4BXTfcU8CmSJG7SwtPqhOLyL3s2tQ21+ot/wLVr9KhW
    Tsdkfjal;sdkfjaklsdjfqwiernzip9qjAW8gZQvc58jIqot4BXTfcU8CmSJG7Sw
    Wf12R/7gGBYceyJ4xrlKY5RtrpC6qVEHLTvBtKKYZTc=
    -----END RSA PRIVATE KEY-----";
        $res = openssl_get_privatekey($priKey);
        openssl_sign($data, $sign, $res);
        openssl_free_key($res);
        $sign = base64_encode($sign);
        $sign = urlencode($sign);
        return $sign;
    }
    // 支付宝合作者身份ID,以2088开头的16位纯数字
    $partner = "2088711882123456";
    // 支付宝账号
    $seller_id = 'test@qq.com';
    // 商品网址
    $base_path = "";
    // 异步通知地址
    $notify_url = "";
    // 订单标题
    $subject = '测试订单标题';
    // 订单详情
    $body = '测试订单内容'; 
    // 订单号,示例代码使用时间值作为唯一的订单ID号
    $out_trade_no = date('YmdHis', time());
    $parameter = array(
        'service'        => 'mobile.securitypay.pay',   // 必填,接口名称,固定值
        'partner'        => $partner,                   // 必填,合作商户号
        '_input_charset' => 'UTF-8',                    // 必填,参数编码字符集
        'out_trade_no'   => $out_trade_no,              // 必填,商户网站唯一订单号
        'subject'        => $subject,                   // 必填,商品名称
        'payment_type'   => '1',                        // 必填,支付类型
        'seller_id'      => $seller_id,                 // 必填,卖家支付宝账号
        'total_fee'      => $total,                     // 必填,总金额,取值范围为[0.01,100000000.00]
        'body'           => $body,                      // 必填,商品详情
        'it_b_pay'       => '1d',                       // 可选,未付款交易的超时时间
        'notify_url'     => $notify_url,                // 可选,服务器异步通知页面路径
        'show_url'       => $base_path                  // 可选,商品展示网站
     );
    //生成需要签名的订单
    $orderInfo = createLinkstring($parameter);
    //签名
    $sign = rsaSign($orderInfo);
    //生成订单
    $dataString = $orderInfo.'&sign="'.$sign.'"&sign_type="RSA"';
    $iOSLink= "alipay://alipayclient/?".urlencode(json_encode(array('requestType' => 'SafePay', "fromAppUrlScheme" => /*iOS App的url schema,支付宝回调用*/"openshare","dataString"=>$dataString)));
    echo $iOSLink;
    ?>
    
    

    新接口(APP支付)拼装调起客户端参数的方案

    注意事项:
    可以参考下面的,务必确保已经签约《app支付》,并且已配置好对应的公玥私钥
    https://blog.csdn.net/kunpeng1987/article/details/73649710

    官方接口文档如下:

    https://docs.open.alipay.com/204/105465

    官方签名工具,强烈推荐

    密钥部分可验签,还有相关的排查问题的一系列方法

    排查错误指南

    https://open.alipay.com/search/searchDetail.htm?tabType=doc&keyword=ALIN10146

    还是在官方搜索比较靠谱。


    image.png

    一些有用的资料

    https://github.com/dcloudio/H5P.Server/tree/master/payment/alipayrsa2

    可以参考的后台返回值:

    "alipayInfo": "_input_charset=\"utf-8\"&body=\"2018年09月03日杭州东-上海南\"&it_b_pay=\"30m\"&notify_url=\"pay.tieyou.com/alipay_notify\"&out_trade_no=\"6701156951-108653793\"&partner=\"2088011641232983\"&payment_type=\"1\"&seller_id=\"2088011641232983\"&service=\"mobile.securitypay.pay\"&sign=\"wXClZZ6K%2FcZOTzn7tO3z9RXB0SQHredtVGzh9aUpNuTWfVlG1DzzINiVZ0YE5W5s5zZsreQcp29%2FhVelByNkSg%3D%3D\"&sign_type=\"RSA\"&subject=\"2018年09月03日杭州东-上海南\"&total_fee=\"69.00\""
    

    相关文章

      网友评论

          本文标题:H5不用支付宝SDK调起客户端

          本文链接:https://www.haomeiwen.com/subject/xsewbftx.html