微信企业付款到个人钱包引发的坑之反思~!

企业付款到个人钱包也就是用户在微信公众平台提现可以直接打入提现者微信的钱包!但要满足:

1)企业开通微信支付90天

2)连续30天有交易才能开通此功能

今天有幸能开发此功能,我只能说我又涨知识了!!!在我编程的这条道路上我又多见到了一些坑!下面就给大家讲一下今天遇到的两个坑!

1)CA证书引入问题,开发过程中遇到了CA证书验证失败的问题,百度之后网上有的说要用绝对路径,有的人说要用相对路径!

小梦使用的是Thinkphp3.2框架开发的这个功能,最终我结果告诉我用绝对路径,还要用到PHP的一个函数getcwd(),代码如下

curl_setopt($curl,CURLOPT_SSLCERT,getcwd()."/cert/apiclient_cert.pem");
curl_setopt($curl,CURLOPT_SSLKEY,getcwd()."/cert/apiclient_key.pem");
curl_setopt($curl,CURLOPT_CAINFO,getcwd()."/cert/rootca.pem");

2)签名和提交数据的一致性问题: 微信签名文档上有详细的说明,但是我按照文档操作迟迟都是签名验证失败!最终总结如下注意点: (1)key是商户设置的密匙和微信支付统一下单的密匙是一样的

(2)加密的数据顺序和提交到微信接口参数值的顺序不能改变也就是我们在传递参数的时候直接讲数组转换成xml提交到微信api,代码如下:

$dataArr=array();
$dataArr['amount']="金额";
$dataArr['check_name']="FORCE_CHECK";
$dataArr['desc']="xxxx";
$dataArr['mch_appid']="微信公众平台的appid";
$dataArr['mchid']="商户号";
$dataArr['nonce_str']= "随机数";
$dataArr['openid']=“用户的openid”;
$dataArr['partner_trade_no']=“交易号”;
$dataArr['re_user_name']=“开启验证用户的真实姓名”;
$dataArr['spbill_create_ip']=“ip地址”;
$sign_obj = WechatSign::getInstance();
$sign = $sign_obj->getSign($dataArr);

WechatSign类文件如下:

/**
 *  作用:格式化参数,签名过程需要使用
*/
function formatBizQueryParaMap($paraMap)
    {
        $buff = "";
        foreach ($paraMap as $k => $v)
        {
            if($k != "sign" && $v != "" && !is_array($v)){
                $buff .= $k . "=" . $v . "&";
            }
        }
        $buff = trim($buff, "&");
        return $buff;
    }
/**
 *  作用:生成签名
*/
function getSign($Obj)
    {
        //签名步骤一:按字典序排序参数
        ksort($Obj);
        //dump($Obj);
        $String = $this->formatBizQueryParaMap($Obj);
        //echo '【string1】'.$String.'</br>';
        //签名步骤二:在string后加入KEY
        $String = $String."&key=商户密匙";
        //echo "【string2】".$String."</br>";
        //签名步骤三:MD5加密
        $String = md5($String);
        //echo "【string3】 ".$String."</br>";
        //签名步骤四:所有字符转为大写
        $result_ = strtoupper($String);
        //echo "【result】 ".$result_."</br>";
        return $result_;
    }

之后获取到签名之后我们直接将数组转换成xml传给微信api

//数组转XML 
function arrayToXml($arr)     
{        
 $xml = "<xml>";        
 foreach ($arr as $key=>$val){            
 if (is_numeric($val)){               
 $xml.="<".$key.">".$val."</".$key.">";             
 }else{
 $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
 }
 }
 $xml.="</xml>";        
 return $xml;     
}

就是这样简简单单的几步,因为参数位置顺序以及数据统一问题拜拜浪费了很多时间,希望哪个小伙伴调用这个接口的时候一定要注意,不要和我一样马马虎虎,简单事情复杂化,一定要好好看文档!!!

原文发布于微信公众号 - 思梦PHP(sm_php)

原文发表时间:2017-11-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

如何在CTF中少走弯路(基础篇)

自己并不是专业的赛棍也没有打过很多比赛,这篇文章是自己在CTF中对于杂项这块知识学习的小结,希望可以对初入CTF的同学有所帮助,在CTF中少走弯路从而更快的提升...

1.4K4
来自专栏Seebug漏洞平台

CVE-2017-16943 Exim UAF漏洞分析

感恩节那天,meh在Bugzilla上提交了一个exim的uaf漏洞:https://bugs.exim.org/show_bug.cgi?id=2199,这周...

4345
来自专栏前端杂货铺

Blob初探

简介   Blob在js中意味着二进制大数据。实现该接口的对象有3个属性,分别是type(MIME),size(byte)和 一个切割方法:slice(在大文件...

3753
来自专栏hrscy

RxSwift - Why

官方建议总是使用 .addDisposableTo(disposeBag) 即使对于简单绑定来说那不是必要的。

1562
来自专栏有趣的Python和你

Python数据分析之贴吧的问与答读取数据库获取question列分词词云

1293
来自专栏Albert陈凯

Spark详解05架构Architecture架构

架构 前三章从 job 的角度介绍了用户写的 program 如何一步步地被分解和执行。这一章主要从架构的角度来讨论 master,worker,driver ...

3258
来自专栏影子

开始食用grpc(之二)

转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9570992.html

6134
来自专栏一个番茄说

Swift中防止ptrace依附

在移动开发中,安全是一个很重要的话题,当然安全是没有绝对的,只能说尽可能的提高安全性。在iOS的开发中,为了防止别人窥视我们的App,我们得采用一些手段来进行防...

1293
来自专栏微信公众号:Java团长

即将发布的 JDK 10 有 109 项新特性,你喜欢哪些?

按计划,JDK 10 将于 3 月 20 日正式发布。据前 Oracle 员工 Simon Ritter 的统计,JDK 10 总共包含 109 项新特性。当然...

702
来自专栏c#开发者

C#开发终端式短信的原理和方法

简介   没发过短信的年轻人肯定是属于那种受保护的稀有动物,通讯发达的今天短信已经成为人们交流的重要手段,其中也蕴含着巨大的市场和经济利益,掌握短信技术的人才也...

4489

扫码关注云+社区

领取腾讯云代金券