微信支付分之免押租(PHP)

770 阅读2分钟
      微信支付分和支付宝的芝麻信用分差不多,应用的领域有免押租赁,先享后付等领域,通过微信的风控系统的评估,来判断用户是否可以享受免押支付。
第一步要申请服务号,需要向微信官方发送邮件,详情请查看
https://pay.weixin.qq.com/wiki/doc/apiv3/payscore.php?chapter=21_1&index=2

申请之后,会有专门的业务人员对接,需要公司资质,根据微信官方发过来的资料进行填写申请,支付成功的回调地址也是在提交资料的时候一并提交的,后期也是可以修改的。申请完成会有一个服务ID,根据服务ID就可以进行相应的开发,开发者和测试人员的微信号要提前提交给对接的业务人员,有些人没有使用过支付分相关产品的,在页面不会显示支付分。

本项目主要是小程序的支付分对接,前期工作准备好了,就可以着手开始了。官方文档:
https://pay.weixin.qq.com/wiki/doc/apiv3/payscore.php?chapter=18_0&index=1

基本上根据此文档进行开发的。

第一步,创建订单,提交地址
 https://api.mch.weixin.qq.com/wxv/createrentbill

,把需要传递的参数提交上去,这些提交都是需要证书的,证书下载请参考

https://kf.qq.com/faq/161222NneAJf161222U7fARv.html

有详细的说明,post提交参数代码如下

 /**
     * 以post方式提交xml到对应的接口url
     *
     * @param string $xml  需要post的xml数据
     * @param string $url  url
     * @param int $second   url执行超时时间,默认30s
     * @throws WxPayException
     */
    private static function postXmlCurl($xml, $url, $second = 30,$useCert=false)
    {
        $ch = curl_init();
        //设置超时
        curl_setopt($ch, CURLOPT_TIMEOUT, $second);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //严格校验
        //设置header
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        //要求结果为字符串且输出到屏幕上
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        if($useCert == true){
            //设置证书
            //使用证书:cert 与 key 分别属于两个.pem文件
            //证书文件请放入服务器的非web目录下
            $sslCertPath = ""; //证书文件存放的目录
            $sslKeyPath = "";
            curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
            curl_setopt($ch,CURLOPT_SSLCERT, $sslCertPath);
            curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
            curl_setopt($ch,CURLOPT_SSLKEY, $sslKeyPath);
        }
        //post提交方式
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
        curl_setopt($ch, CURLOPT_TIMEOUT, 40);
        set_time_limit(0);
        //运行curl
        $data = curl_exec($ch);

        //返回结果
        if ($data) {
            curl_close($ch);
            return $data;
        }
    }
签名代码,支付分的只支持HMAC-SHA256的签名方法
 /**
     * 生成签名
     * @param WxPayConfigInterface $config  配置对象
     * @param bool $needSignType  是否需要补signtype
     * @return 签名,本函数不覆盖sign成员变量,如要设置签名需要调用SetSign方法赋值
     */
    public function MakeSign($values, $key)
   {
    //签名步骤一:按字典序排序参数
    ksort($values);
    $string = $this->ToUrlParams($values);
    //签名步骤二:在string后加入KEY
    $string = $string . "&key=".$key;
    //签名步骤三:MD5加密或者HMAC-SHA256
    if($values['sign_type'] == "MD5"){
        $string = md5($string);
    } else if($values['sign_type'] == "HMAC-SHA256") {
        $string = hash_hmac("sha256",$string ,$key);
    } else {
        throw new WxPayException("签名类型不支持!");
    }
    //签名步骤四:所有字符转为大写
    $result = strtoupper($string);
    return $result;
   }

以下代码是格式化成url参数

  /**
     * 格式化参数格式化成url参数
     */
    public function ToUrlParams($values)
    {
        $buff = "";
        foreach ($values as $k => $v)
        {
           if($k != "sign" && $v != "" && !is_array($v)){
            if($k != "sign" && !is_array($v)){
                $buff .= $k . "=" . $v . "&";
            }
        }
        $buff = trim($buff, "&");
        return $buff;
    }

签名key的设置

官方还有检验签名的工具pay.weixin.qq.com/wiki/doc/ap…

可以通过该工具查看签名是否正确。

创建订单成功之后,官方返回的是xml数据,需要将其转成数组

//    将数组转化为xml数据格式
    public function arrayToXml($arr)
    {
        $xml = "<xml>";
        foreach ($arr as $key => $val) {
            if (is_array($val)) {
                $xml .= "<" . $key . ">" . $this->arrayToXml($val) . "</" . $key . ">";
            } else {
                $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
            }
        }
        $xml .= "</xml>";
        return $xml;
    }

把获取到的参数通过接口传递给小程序端,详情请看链接

https://pay.weixin.qq.com/wiki/doc/apiv3/payscore.php?chapter=30_1&index=1

我这边是把小程序端需要用到的数据通过后端处理之后一并传递过去的。

回调:用户确认订单并且支付成功之后会有回调信息,回调信息是有进行加密的,需要进行解密之后才可以获取订单号等信息,详情请参考

https://pay.weixin.qq.com/wiki/doc/apiv3/payscore.php?chapter=18_7&index=7

数据解密使用的密钥和加密使用的密钥不一致,需要注意。

订单完结:

接口:

https://api.mch.weixin.qq.com/wxv/finishrentbill

文档:

https://pay.weixin.qq.com/wiki/doc/apiv3/payscore.php?chapter=18_1&index=2

把需要的字段和扣款金额等传入进去,注意,扣款金额不能大于押金金额。

输入订单号,商户号,服务ID,小程序appid即可取消订单。

小程序端需要使用到,后端将查询到的数据返回给前端处理,可查询订单的详细信息。

将xml转化成json数组

public function xmlToArray($xml,$type='')
{    //禁止引用外部xml实体   
     libxml_disable_entity_loader(true);
     $xmlstring = simplexml_load_string($xml,'SimpleXMLElement', LIBXML_NOCDATA);
     if ($type == "json") {       
     $json = json_encode($xmlstring);        
      return $json;   
       }
     $arr = json_decode(json_encode($xmlstring),true);
     return $arr;
}

官方整理出一些常见的问题

https://developers.weixin.qq.com/community/pay/doc/0004060fa7c65855d698166145b808

以上内容仅供参考,只贴的部分代码。