TypechoJoeTheme

醉秋风

登录
用户名
密码
/
注册
用户名
邮箱

醉秋风

要相信,一切都是最好的安排!!

微信电商收付通系列一,对请求进行签名,拼接Authorization

2020-04-09
/
4 评论
/
56,064 阅读
/
正在检测是否收录...
04/09

开头语

最近对接了下微信刚出的电商收付通接口,过程也是不容易,踩了几个小坑,所以在此记录下来,希望能帮到有需要的人,限于本人经验,如有错误,欢迎指正。

介绍

电商收付通是微信支付专为电商行业场景打造的支付、结算解决方案。 电商平台在申请之前需入驻成为微信支付服务商(入驻指引)。电商平台的平台商户入驻微信支付成为二级商户。电商收付通支持将多个二级商户的订单进行合单支付(如电商购物车中的多笔订单合并支付),合单支付款项分别进入到二级商户各自的账户(资金为冻结状态);电商平台在满足业务流程条件下(如确认收货等),可将二级商户的冻结状态的资金解冻,并收取平台佣金。

相关能力

  • 商户进件入驻
  • 合单支付
  • 订单退款
  • 交易分账
  • 营销补贴
  • 电商平台承担支付手续费

业务场景

社会化分销、网红带货如火如荼,加入这个大浪潮的你还在汇总记账然后转账给达人吗?分账功能,拯救濒临崩溃的财务小姐姐,拿去不谢。开通「电商收付通」后,电商平台直接拥有分账功能,可根据与卖家的协议,实现卖家交易款在线抽成。此外,还可将分销方等角色添加为分账接收方,满足多渠道分销、网红达人带货场景下的多方灵活分账。关于如何开通电商收付通、产品介绍、接入流程、接口规则、开发指引 请前往官网地址查看,不再赘述。

正题: 签名生成

微信支付API v3要求商户对请求进行签名。微信支付会在收到请求后进行签名的验证。如果签名验证不通过,微信支付API v3将会拒绝处理请求,并返回401 Unauthorized。也就是说请求电商收付通的每个接口都需要在请求头传入Authorization,否则请求不会成功。下面看签名生成的代码:

    /**
     * [sign 签名]
     * @param  [type] $url             [请求目标]
     * @param  [type] $http_method     [请求方式 GET POST PUT]
     * @param  [type] $timestamp       [时间戳]
     * @param  [type] $nonce           [随机串]
     * @param  [type] $body            [报文 GET请求时可以为空]
     * @param  [type] $mch_private_key [api 密钥]
     * @param  [type] $merchant_id     [发起请求的商户(包括直连商户、服务商或渠道商)的商户号mchid]
     * @param  [type] $serial_no       [证书序列号
     * @return [type]                  [返回为签名串]
     */
    private function sign($url,$http_method,$timestamp,$nonce,$body,$mch_private_key,$merchant_id,$serial_no){

        if (!in_array('sha256WithRSAEncryption', \openssl_get_md_methods(true))) {
            throw new BadRequestException("当前PHP环境不支持SHA256withRSA");
        }

        $url_parts = parse_url($url);

        $canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));
        $message =
            $http_method."\n".
            $canonical_url."\n".
            $timestamp."\n".
            $nonce."\n".
            $body."\n";
        openssl_sign($message, $raw_sign, $mch_private_key, 'sha256WithRSAEncryption');
        $sign = base64_encode($raw_sign);
        $token = sprintf('mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"',
            $merchant_id, $nonce, $timestamp, $serial_no, $sign);
        return $token;
    }
    //作用:产生随机字符串,不长于32位
    private function createNoncestr($length = 32) {
        $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) { 
                $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        } 
        return $str; 
     }

拼接Authorization

这里用合单支付举例,Authorization后面紧跟的是认证类型,目前为WECHATPAY2-SHA256-RSA2048

        $header[] = 'User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36';
        $header[] = 'Accept:application/json';
        $header[] = 'Content-Type:application/json';
        $header[] = 'Authorization:WECHATPAY2-SHA256-RSA2048 '.$token;

验签

验签可以用官方提供的工具,也可以从利用openssl_verify进行验签。

微信收付通签名
朗读
赞(3)
赞赏
感谢您的支持,我会继续努力哒!

三合一收款

下面三种方式都支持哦

微信
QQ
支付宝
打开支付宝/微信/QQ扫一扫,即可进行扫码打赏哦
版权属于:

醉秋风

本文链接:

https://blog.slomoo.cn/143.html(转载时请注明本文出处及文章链接)

评论 (4)
  1. yy 作者
    MacOS · FireFox

    请问一下电商收付通你那有Demo吗?

    2020-12-04 回复
    1. 醉秋风 作者
      Windows 10 · Google Chrome
      @yy

      具体哪个demo 都有

      2020-12-04 回复
  2. 刘欣怡 作者
    Linux · Google Chrome

    对方

    2020-06-11 回复
  3. 今日新鲜事 作者
    Windows 7 · Google Chrome

    文章不错非常喜欢

    2020-04-09 回复

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月
广告

标签云