php如何实现微信企业付款(代码实例)

来源:不言 发布时间:2018-12-13 15:34:08 阅读量:891

本篇文章给大家带来的内容是关于php如何实现微信企业付款(代码实例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

一、封装微信企业付款类WeiXinPayToUser,如下图代码所示:

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

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

class WeixinPayToUser

{

    /**

     * API 参数

     * @var array

     * 'mch_appid'         # 公众号APPID

     * 'mchid'             # 商户号

     * 'device_info'       # 设备号

     * 'nonce_str'         # 随机字符串

     * 'partner_trade_no'  # 商户订单号

     * 'openid'            # 收款用户openid

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

     * 're_user_name'      # 收款用户姓名

     * 'amount'            # 付款金额

     * 'desc'              # 企业付款描述信息

     * 'spbill_create_ip'  # Ip地址

     * 'sign'              # 签名

     */

    public $parameters = [];

    public $SSLROOTCA_PATH='';

    public $SSLCERT_PATH='';

    public $SSLKEY_PATH='';

    public $appid='';

    public $secret='';

    public $mchid='';

    public $key='';//商户密钥

 

    public function __construct()

    {

 

        $this->url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';

        $this->curl_timeout = 10;

        $this->SSLROOTCA_PATH=dirname(__FILE__).'/weixin/cert/rootca.pem';

        $this->SSLCERT_PATH=dirname(__FILE__).'/weixin/cert/apiclient_cert.pem';

        $this->SSLKEY_PATH=dirname(__FILE__).'/weixin/cert/apiclient_key.pem';

    }

 

    public function setParameter($key,$value){

        $this->parameters[$key]=$value;

    }

 

    function arrayToXml($arr,$dom=0,$item=0){

        if (!$dom){

            $dom = new DOMDocument("1.0");

        }

        if(!$item){

            $item = $dom->createElement("xml");

            $dom->appendChild($item);

        }

        foreach ($arr as $key=>$val){

            $itemx = $dom->createElement(is_string($key)?$key:"item");

            $item->appendChild($itemx);

            if (!is_array($val)){

                $text = $dom->createTextNode($val);

                $itemx->appendChild($text);

 

            }else {

                $this->arrayToXml($val,$dom,$itemx);

            }

        }

        $dom->encoding = 'UTF-8'; // insert proper

        return $dom->saveXML();

    }

 

    public function getSign($paramArr){//print_r($paramArr);

        ksort($paramArr);

        $paramStr = http_build_query($paramArr);

        $paramStr=urldecode($paramStr);

        $param_temp=$paramStr.'&key='.$this->key;//echo $param_temp.'<br>';

        $signValue=strtoupper(md5($param_temp));//echo $signValue.'<br>';

        return $signValue;

 

    }

 

    /**

     * 生成请求xml数据

     * @return string

     */

    public function createXml()

    {

        $this->parameters['mch_appid'] = $this->appid;

        $this->parameters['mchid']     = $this->mchid;

       // $this->parameters['nonce_str'] = md5(time());

        $this->parameters['nonce_str'] = 'dddfff';

        $this->parameters['sign']      = $this->getSign($this->parameters);

        $a= $this->arrayToXml($this->parameters);

        //echo $a;

        return $a;

    }

 

    public function pay(){

        $xml=$this->createXml();

        $url=$this->url;

        return $this->postXmlSSLCurl($xml,$url,$second=30);

    }

 

    /**

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

     */

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

    {

 

        $ch = curl_init();

        //超时时间

        curl_setopt($ch,CURLOPT_TIMEOUT,$second);

        //这里设置代理,如果有的话

        //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');

        //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, $this->SSLROOTCA_PATH);

        //使用证书:cert 与 key 分别属于两个.pem文件

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

        curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');

        curl_setopt($ch,CURLOPT_SSLCERT, $this->SSLCERT_PATH);

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

        curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');

        curl_setopt($ch,CURLOPT_SSLKEY, $this->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='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>错误原因查询</a></br>";

            curl_close($ch);

            return false;

        }

    }

 

 

}

?>

二、调用WeiXinPayToUser,如下图所示:

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

/**

     * 企业付款测试

     */

    public function payToUser()

    {

    

        $mchPay = new WeiXinPayToUser();

        // 用户openid

        $mchPay->setParameter('openid', 'oy2lbszskklaslEKThrzqEziKEBzqU');

        // 商户订单号

        $mchPay->setParameter('partner_trade_no', 'test-'.time());

        // 校验用户姓名选项

        $mchPay->setParameter('check_name', 'NO_CHECK');

        // 企业付款金额  单位为分

        $mchPay->setParameter('amount', 100);

        // 企业付款描述信息

        $mchPay->setParameter('desc', '开发测试');

        // 调用接口的机器IP地址  自定义

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

        // 收款用户姓名

        // $mchPay->setParameter('re_user_name', 'Max wen');

        // 设备信息

        // $mchPay->setParameter('device_info', 'dev_server');

 

        $response = $mchPay->postXmlSSL();

        if( !empty($response) ) {

            $data = simplexml_load_string($response, null, LIBXML_NOCDATA);

            echo json_encode($data);

        }else{

            echo json_encode( array('return_code' => 'FAIL', 'return_msg' => 'transfers_接口出错', 'return_ext' => array()) );

        }

    }

}


标签: PHP
分享:
评论:
你还没有登录,请先