首頁 > 微信小程式 > 小程式開發 > 小程式開發之企業付款

小程式開發之企業付款

Y2J
發布: 2017-05-09 09:58:11
原創
3316 人瀏覽過

寫這篇文章的目的主要是由於在微信公眾平台提供的SDK中並沒有提供此功能的SDK實現,

其實最後實現還是藉助 微信公眾平台開發文件 和SDK 。

企業付款的應用程式場景: 公眾號向已關注用戶付款,例如處理退款、財務結算等

先說一下實現想法:

在SDK中自帶類別庫的基礎上擴充WxMchPay元件, 實作企業付款功能的擴充。

話不多說,上程式碼, 下面是繼承SDK,實作企業付款的元件:

$ parameters參數參考:企業付款API的文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

<?php// 引入SDKimport(&#39;Common.Util.WxPay&#39;);/**

 * 微信企业付款操作类

 * Author  :  Max.wen

 * DateTime: <15/9/16 11:00> */class WxMchPay extends Wxpay_client_pub

{    /**

     * API 参数

     * @var array

     * &#39;mch_appid&#39;         # 公众号APPID

     * &#39;mchid&#39;             # 商户号

     * &#39;device_info&#39;       # 设备号

     * &#39;nonce_str&#39;         # 随机字符串

     * &#39;partner_trade_no&#39;  # 商户订单号

     * &#39;openid&#39;            # 收款用户openid

     * &#39;check_name&#39;        # 校验用户姓名选项 针对实名认证的用户

     * &#39;re_user_name&#39;      # 收款用户姓名

     * &#39;amount&#39;            # 付款金额

     * &#39;desc&#39;              # 企业付款描述信息

     * &#39;spbill_create_ip&#39;  # Ip地址

     * &#39;sign&#39;              # 签名     */

    public $parameters = [];    public function construct()

    {        $this->url = &#39;https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers&#39;;        $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT;

    }    /**

     * 生成请求xml数据

     * @return string     */

    public function createXml()

    {        $this->parameters[&#39;mch_appid&#39;] = WxPayConf_pub::APPID;        $this->parameters[&#39;mchid&#39;]     = WxPayConf_pub::MCHID;        $this->parameters[&#39;nonce_str&#39;] = $this->createNoncestr();        $this->parameters[&#39;sign&#39;]      = $this->getSign($this->parameters);        return $this->arrayToXml($this->parameters);

    }    /**

     *     作用:使用证书,以post方式提交xml到对应的接口url     */

    function postXmlSSLCurl($xml,$url,$second=30)

    {        $ch = curl_init();        //超时时间

        curl_setopt($ch,CURLOPT_TIMEOUT,$second);        //这里设置代理,如果有的话

        //curl_setopt($ch,CURLOPT_PROXY, &#39;8.8.8.8&#39;);

        //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);

        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);        //设置证书

        curl_setopt($ch,CURLOPT_CAINFO, WxPayConf_pub::SSLROOTCA_PATH);        //使用证书:cert 与 key 分别属于两个.pem文件

        //默认格式为PEM,可以注释

        curl_setopt($ch,CURLOPT_SSLCERTTYPE,&#39;PEM&#39;);

        curl_setopt($ch,CURLOPT_SSLCERT, WxPayConf_pub::SSLCERT_PATH);        //默认格式为PEM,可以注释

        curl_setopt($ch,CURLOPT_SSLKEYTYPE,&#39;PEM&#39;);

        curl_setopt($ch,CURLOPT_SSLKEY, WxPayConf_pub::SSLKEY_PATH);        //post提交方式

        curl_setopt($ch,CURLOPT_POST, true);

        curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);        $data = curl_exec($ch);        //返回结果

        if($data){

            curl_close($ch);            return $data;

        }        else {            $error = curl_errno($ch);            echo "curl出错,错误码:$error"."<br>";            echo "<a href=&#39;http://curl.haxx.se/libcurl/c/libcurl-errors.html&#39;>错误原因查询</a></br>";

            curl_close($ch);            return false;

        }

    }

 

 

}

登入後複製

Controller層功能實作:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<?php/**

 * Author  :  Max.wen

 * DateTime: <15/9/20 16:47> */namespace Home\Controller;class TestController extends CommonController

{    /**

     * 企业付款测试     */

    public function rebate()

    {

        import(&#39;Common.Util.WxMchPay&#39;);        $mchPay = new \WxMchPay();        // 用户openid

        $mchPay->setParameter(&#39;openid&#39;, &#39;oy2lbszXkgvlEKThrzqEziKEBzqU&#39;);        // 商户订单号

        $mchPay->setParameter(&#39;partner_trade_no&#39;, &#39;test-&#39;.time());        // 校验用户姓名选项

        $mchPay->setParameter(&#39;check_name&#39;, &#39;NO_CHECK&#39;);        // 企业付款金额  单位为分

        $mchPay->setParameter(&#39;amount&#39;, 100);        // 企业付款描述信息

        $mchPay->setParameter(&#39;desc&#39;, &#39;开发测试&#39;);        // 调用接口的机器IP地址  自定义

        $mchPay->setParameter(&#39;spbill_create_ip&#39;, &#39;127.0.0.1&#39;); # getClientIp()

        // 收款用户姓名

        // $mchPay->setParameter(&#39;re_user_name&#39;, &#39;Max wen&#39;);

        // 设备信息

        // $mchPay->setParameter(&#39;device_info&#39;, &#39;dev_server&#39;);

 

        $response = $mchPay->postXmlSSL();        if( !empty($response) ) {            $data = simplexml_load_string($response, null, LIBXML_NOCDATA);            echo json_encode($data);

        }else{            echo json_encode( array(&#39;return_code&#39; => &#39;FAIL&#39;, &#39;return_msg&#39; => &#39;transfers_接口出错&#39;, &#39;return_ext&#39; => array()) );

        }

    }

}

登入後複製

完成上述兩部分程式碼,基本就可以成功呼叫企業付款API了。

傳回結果的資料結構範例:

1

2

3

4

5

6

7

8

9

10

11

12

{

    "return_code": "SUCCESS",

    "return_msg": { },

    "mch_appid": "wx519cae424099ed6b",

    "mchid": "1228636402",

    "device_info": { },

    "nonce_str": "qjupk84q4iqxkb578hb5h2qiatgcwxwg",

    "result_code": "SUCCESS",

    "partner_trade_no": "test-1442801966",

    "payment_no": "1000018301201509210739170397",

    "payment_time": "2015-09-21 10:19:26"

}

登入後複製

可能遇到的問題:

## 1.CA證書錯誤

  在WxMchPay中大家可以看到,我重寫了SDK中 Wxpay_client_pub 的 postXmlSSLCurl()方法

##   因為預設在SDK中的這個方法在CURL

POST要求的時候沒有附帶CA憑證。

  相較之下就多了 

  

curl_setopt($ch,CURLOPT_CAINFO, WxPayConf_pub::SSLROOTCA_PATH);PATH);PATH);這麼一行程式碼。  

  作用就是請求時附帶CA憑證。

2、對同一用戶轉帳操作過於頻繁,請稍候重試.

  這個錯誤屬於微信服務端的限制,具體限制頻率也沒有找到那裡有說明,不過經過實際測試大概在1分鐘左右。

  所以在開發的時候還需要多注意。

【相關推薦】 

1. 微信公眾號平台原始碼下載

2. 微信投票原始碼免費下載

以上是小程式開發之企業付款的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板