Home > Backend Development > PHP Tutorial > Share a packaged PHP WeChat payment class library (code scanning, H5, mini program)

Share a packaged PHP WeChat payment class library (code scanning, H5, mini program)

藏色散人
Release: 2023-04-10 11:18:02
forward
3953 people have browsed it

php WeChat payment class parameters are used directly (scan code, H5, mini program)

When we write related payments, WeChat payment is often used,

Using WeChat payment in php is relatively simple,

WeChat payment documentation: https://pay.weixin.qq.com/wiki/doc/api/index.html

Here is a brief introduction to several uses of WeChat payment.

Here I have encapsulated a WeChat payment class library.

You can use it by directly passing parameters:

First put Fill in the configuration file completely (be careful not to fill it in wrong, otherwise it will cause a signature error):

1

2

3

4

5

6

7

8

9

$config = array(

    'appid'         => '', // 微信支付appid

    'xcxappid'      => '', // 微信小程序appid

    'mch_id'        => '', // 微信支付 mch_id 商户收款账号

    'key'           => '', // 微信支付key

    'appsecret'     => '', // 公众帐号secert(公众号支付专用)

    'notify_url'    => '', // 接收支付状态的连接  改成自己的回调地址

    'redirect_uri'  => '', // 公众号支付时,没有code,获取openid使用

);

Copy after login

I have also turned it into a function for related payments for ease of use,

WeChat scan code payment:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

/**

 * [qrcodePay 微信扫码支付]

 * @param  [type] $order [订单信息数组]

 * @return [type]        [description]

 * $order = array(

 *      'body'          => '', // 产品描述

 *      'total_fee'     => '', // 订单金额(分)

 *      'out_trade_no'  => '', // 订单编号

 *      'product_id'    => '', // 产品id(可用订单编号)

 * );

 */

public static function qrcodePay($order=NULL)

{

    if(!is_array($order) || count($order) < 4){

        die("数组数据信息缺失!");

    }

    $order[&#39;trade_type&#39;] = &#39;NATIVE&#39;; // Native支付

    $result = self::unifiedOrder($order);

    $decodeurl = urldecode($result[&#39;code_url&#39;]);

    return $decodeurl; // 使用返回链接直接生成二维码

}

Copy after login

WeChat H5 payment:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

/**

 * [weixinH5 微信H5支付]

 * @param  [type] $order [订单信息数组]

 * @return [type]        [description]

 * $order = array(

 *      &#39;body&#39;          => &#39;&#39;, // 产品描述

 *      &#39;total_fee&#39;     => &#39;&#39;, // 订单金额(分)

 *      &#39;out_trade_no&#39;  => &#39;&#39;, // 订单编号

 *      &#39;product_id&#39;    => &#39;&#39;, // 产品id(可用订单编号)

 * );

 */

public static function h5Pay($order=NULL)

{

    if(!is_array($order) || count($order) < 4){

        die("数组数据信息缺失!");

    }

    $order[&#39;trade_type&#39;] = &#39;MWEB&#39;; // H5支付

    $result = self::unifiedOrder($order);

    if ($result[&#39;return_code&#39;]==&#39;SUCCESS&#39; && $result[&#39;result_code&#39;]==&#39;SUCCESS&#39;)

        return $result[&#39;mweb_url&#39;]; // 返回链接让用户点击跳转

    if ($result[&#39;err_code_des&#39;])

        die($result[&#39;err_code_des&#39;]);

    return false;

}

Copy after login

WeChat mini program payment:

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

/**

 * [xcxPay 获取jssdk需要用到的数据]

 * @param  [type]  $order [订单信息数组]

 * @param  boolean $type  [区分是否是小程序,默认 true]

 * @return [type]         [description]

 * $order = array(

 *      &#39;body&#39;          => &#39;&#39;, // 产品描述

 *      &#39;total_fee&#39;     => &#39;&#39;, // 订单金额(分)

 *      &#39;out_trade_no&#39;  => &#39;&#39;, // 订单编号

 *      &#39;product_id&#39;    => &#39;&#39;, // 产品id(可用订单编号)

 *      &#39;openid&#39;        => &#39;&#39;, // 用户openid

 * );

 */

public static function xcxPay($order=NULL,$type=true)

{

    if(!is_array($order) || count($order) < 5){

        die("数组数据信息缺失!");

    }

    $order[&#39;trade_type&#39;] = &#39;JSAPI&#39;; // 小程序支付

    $result = self::unifiedOrder($order,$type);

    if ($result[&#39;return_code&#39;]==&#39;SUCCESS&#39; && $result[&#39;result_code&#39;]==&#39;SUCCESS&#39;) {

        $data = array (

            &#39;appId&#39;     => $type ? $this->config[&#39;xcxappid&#39;] : $this->config[&#39;appid&#39;],

            &#39;timeStamp&#39; => time(),

            &#39;nonceStr&#39;  => self::get_rand_str(32, 0, 1), // 随机32位字符串

            &#39;package&#39;   => &#39;prepay_id=&#39;.$result[&#39;prepay_id&#39;],

            &#39;signType&#39;  => &#39;MD5&#39;, // 加密方式

        );

        $data[&#39;paySign&#39;] = self::makeSign($data);

        return $data; // 数据小程序客户端

    } else {

        if ($result[&#39;err_code_des&#39;])

            die($result[&#39;err_code_des&#39;]);

        return false;

    }

}

Copy after login

Usage method (mini program payment is used as an example here):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<?php

include &#39;./WeixinPay.php&#39;;

$get = $_GET;

$weixinpay = new \feng\WeixinPay($config);

$order_sn = time().rand(1000,9999);

$order = array(

    &#39;body&#39;          => &#39;测试商品&#39;, // 产品描述

    &#39;total_fee&#39;     => &#39;1&#39;, // 订单金额(分)

    &#39;out_trade_no&#39;  => $order_sn, // 订单编号

    &#39;product_id&#39;    => $order_sn, // 产品id(可用订单编号)

    &#39;openid&#39;        => $get[&#39;openid&#39;], // 用户openid

);

$re = $weixinpay->xcxPay($order);

die(json_encode($re)); // JSON化直接返回小程序客户端

Copy after login

The following code is encapsulated A good and complete payment file (WeixinPay.php),

can be modified at will according to your own needs (modify and improve Gitee and GitHub from time to time):

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

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

367

368

369

370

371

372

373

374

375

376

377

378

379

380

381

382

383

384

385

386

387

388

389

390

391

392

393

394

395

396

397

398

399

400

401

402

403

404

405

406

407

408

409

410

411

412

413

414

415

416

417

418

419

420

421

422

423

424

425

426

427

428

429

430

431

432

433

434

435

436

<?php

/**

 * @Author: [FENG] <1161634940@qq.com>

 * @Date:   2019-09-06 09:50:30

 * @Last Modified by:   [FENG] <1161634940@qq.com>

 * @Last Modified time: 2020-10-08T17:33:39+08:00

 */

namespace feng;

error_reporting(E_ALL);

ini_set(&#39;display_errors&#39;, &#39;1&#39;);

// 定义时区

ini_set(&#39;date.timezone&#39;,&#39;Asia/Shanghai&#39;);

class WeixinPay

{

    // 定义相关配置项

    private static $sslcert_path = &#39;./cert/apiclient_cert.pem&#39;; // 证书(退款时使用)

    private static $sslkey_path = &#39;./cert/apiclient_key.pem&#39;; // 证书(退款时使用)

    private static $referer = &#39;&#39;;

    private static $config = array(

        &#39;appid&#39;         => &#39;&#39;, // 微信支付appid

        &#39;xcxappid&#39;      => &#39;&#39;, // 微信小程序appid

        &#39;mch_id&#39;        => &#39;&#39;, // 微信支付 mch_id 商户收款账号

        &#39;key&#39;           => &#39;&#39;, // 微信支付key

        &#39;appsecret&#39;     => &#39;&#39;, // 公众帐号secert(公众号支付专用)

        &#39;notify_url&#39;    => &#39;&#39;, // 接收支付状态的连接  改成自己的回调地址

        &#39;redirect_uri&#39;  => &#39;&#39;, // 公众号支付时,没有code,获取openid使用

    );

    /**

     * [__construct 构造函数]

     * @param [type] $config [传递微信支付相关配置]

     */

    public function __construct($config=NULL, $referer=NULL){

        $config && self::$config = $config;

        self::$referer = $referer ? $referer : $_SERVER[&#39;HTTP_HOST&#39;];

    }

    /**

     * [unifiedOrder 统一下单]

     * @param  [type]  $order [订单信息(必须包含支付所需要的参数)]

     * @param  boolean $type  [区分是否是小程序,是则传 true]

     * @return [type]         [description]

     * $order = array(

     *      &#39;body&#39;          => &#39;&#39;, // 产品描述

     *      &#39;total_fee&#39;     => &#39;&#39;, // 订单金额(分)

     *      &#39;out_trade_no&#39;  => &#39;&#39;, // 订单编号

     *      &#39;product_id&#39;    => &#39;&#39;, // 产品id

     *      &#39;trade_type&#39;    => &#39;&#39;, // 类型:JSAPI--JSAPI支付(或小程序支付)、NATIVE--Native支付、APP--app支付,MWEB--H5支付

     * );

     */

    public static function unifiedOrder($order, $type=NULL)

    {

        $weixinpay_config = array_filter(self::$config);

        // 获取配置项

        $config = array(

            &#39;appid&#39;             => empty($type) ? $weixinpay_config[&#39;appid&#39;] : $weixinpay_config[&#39;xcxappid&#39;],

            &#39;mch_id&#39;            => $weixinpay_config[&#39;mch_id&#39;],

            &#39;nonce_str&#39;         => &#39;test&#39;,

            &#39;spbill_create_ip&#39;  => self::get_iP(),

            &#39;notify_url&#39;        => $weixinpay_config[&#39;notify_url&#39;]

        );

        $data = array_merge($order, $config); // 合并配置数据和订单数据

        $sign = self::makeSign($data); // 生成签名

        $data[&#39;sign&#39;] = $sign;

        $xml = self::array_to_xml($data);

        $url = &#39;https://api.mch.weixin.qq.com/pay/unifiedorder&#39;;//接收xml数据的文件

        $header[] = "Content-type: text/xml";//定义content-type为xml,注意是数组

        $ch = curl_init ($url);

        curl_setopt($ch, CURLOPT_URL, $url);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 兼容本地没有指定curl.cainfo路径的错误

        curl_setopt($ch, CURLOPT_REFERER, self::$referer);        //设置 referer

        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);

        curl_setopt($ch, CURLOPT_POST, 1);

        curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);

        $response = curl_exec($ch);

        if(curl_errno($ch)){

            die(curl_error($ch)); // 显示报错信息;终止继续执行

        }

        curl_close($ch);

        $result = self::xml_to_array($response);

        if ($result[&#39;return_code&#39;]==&#39;FAIL&#39;)

            die($result[&#39;return_msg&#39;]); // 显示错误信息

        if ($result[&#39;result_code&#39;]==&#39;FAIL&#39;)

            die($result[&#39;err_code_des&#39;]); // 显示错误信息

        $result[&#39;sign&#39;] = $sign;

        $result[&#39;nonce_str&#39;] = &#39;test&#39;;

        return $result;

    }

    /**

     * [qrcodePay 微信扫码支付]

     * @param  [type] $order [订单信息数组]

     * @return [type]        [description]

     * $order = array(

     *      &#39;body&#39;          => &#39;&#39;, // 产品描述

     *      &#39;total_fee&#39;     => &#39;&#39;, // 订单金额(分)

     *      &#39;out_trade_no&#39;  => &#39;&#39;, // 订单编号

     *      &#39;product_id&#39;    => &#39;&#39;, // 产品id(可用订单编号)

     * );

     */

    public static function qrcodePay($order=NULL)

    {

        if(!is_array($order) || count($order) < 4){

            die("数组数据信息缺失!");

        }

        $order[&#39;trade_type&#39;] = &#39;NATIVE&#39;; // Native支付

        $result = self::unifiedOrder($order);

        $decodeurl = urldecode($result[&#39;code_url&#39;]);

        return $decodeurl;

        // qrcode($decodeurl);

        // qrcodeWithPicture($decodeurl);

    }

    /**

     * [jsPay 获取jssdk需要用到的数据]

     * @param  [type] $order [订单信息数组]

     * @return [type]        [description]

     * $order = array(

     *      &#39;body&#39;          => &#39;&#39;, // 产品描述

     *      &#39;total_fee&#39;     => &#39;&#39;, // 订单金额(分)

     *      &#39;out_trade_no&#39;  => &#39;&#39;, // 订单编号

     *      &#39;product_id&#39;    => &#39;&#39;, // 产品id(可用订单编号)

     * );

     */

    public static function jsPay($order=NULL,$code=NULL){

        $config=self::$config;

        if (!is_array($order) || count($order) < 4)

            die("数组数据信息缺失!");

        if (count($order) == 5) {

            $data = self::xcxPay($order, false); // 获取支付相关信息(获取非小程序信息)

            return $data;

        }

        empty($code) && $code = $_GET[&#39;code&#39;];

        // 如果没有get参数没有code;则重定向去获取openid;

        if (empty($code)) {

            $out_trade_no = $order[&#39;out_trade_no&#39;]; // 获取订单号

            $redirect_uri = $config[&#39;redirect_uri&#39;]; // 返回的url

            $redirect_uri = urlencode($redirect_uri);

            $url = &#39;https://open.weixin.qq.com/connect/oauth2/authorize?appid=&#39;.$config[&#39;appid&#39;].&#39;&redirect_uri=&#39;.$redirect_uri.&#39;&response_type=code&scope=snsapi_base&state=&#39;.$out_trade_no.&#39;#wechat_redirect&#39;;

            header(&#39;Location: &#39;.$url);

        } else {

            // 组合获取prepay_id的url

            $url = &#39;https://api.weixin.qq.com/sns/oauth2/access_token?appid=&#39;.$config[&#39;appid&#39;].&#39;&secret=&#39;.$config[&#39;appsecret&#39;].&#39;&code=&#39;.$code.&#39;&grant_type=authorization_code&#39;;

            $result = self::curl_get_contents($url); // curl获取prepay_id

            $result = json_decode($result,true);

            $order[&#39;openid&#39;] = $result[&#39;openid&#39;]; // 获取到的openid

            $data = self::xcxPay($order, false); // 获取支付相关信息(获取非小程序信息)

            return $data;

        }

    }

    /**

     * [xcxPay 获取jssdk需要用到的数据]

     * @param  [type]  $order [订单信息数组]

     * @param  boolean $type  [区分是否是小程序,默认 true]

     * @return [type]         [description]

     * $order = array(

     *      &#39;body&#39;          => &#39;&#39;, // 产品描述

     *      &#39;total_fee&#39;     => &#39;&#39;, // 订单金额(分)

     *      &#39;out_trade_no&#39;  => &#39;&#39;, // 订单编号

     *      &#39;product_id&#39;    => &#39;&#39;, // 产品id(可用订单编号)

     *      &#39;openid&#39;        => &#39;&#39;, // 用户openid

     * );

     */

    public static function xcxPay($order=NULL,$type=true)

    {

        if(!is_array($order) || count($order) < 5){

            die("数组数据信息缺失!");

        }

        $order[&#39;trade_type&#39;] = &#39;JSAPI&#39;; // 小程序支付

        $result = self::unifiedOrder($order,$type);

        if ($result[&#39;return_code&#39;]==&#39;SUCCESS&#39; && $result[&#39;result_code&#39;]==&#39;SUCCESS&#39;) {

            $data = array (

                &#39;appId&#39;     => $type ? self::$config[&#39;xcxappid&#39;] : self::$config[&#39;appid&#39;],

                &#39;timeStamp&#39; => (string)time(),

                &#39;nonceStr&#39;  => self::get_rand_str(32, 0, 1), // 随机32位字符串

                &#39;package&#39;   => &#39;prepay_id=&#39;.$result[&#39;prepay_id&#39;],

                &#39;signType&#39;  => &#39;MD5&#39;, // 加密方式

            );

            $data[&#39;paySign&#39;] = self::makeSign($data);

            return $data; // 数据小程序客户端

        } else {

            if ($result[&#39;err_code_des&#39;])

                die($result[&#39;err_code_des&#39;]);

            return false;

        }

    }

    /**

     * [weixinH5 微信H5支付]

     * @param  [type] $order [订单信息数组]

     * @return [type]        [description]

     * $order = array(

     *      &#39;body&#39;          => &#39;&#39;, // 产品描述

     *      &#39;total_fee&#39;     => &#39;&#39;, // 订单金额(分)

     *      &#39;out_trade_no&#39;  => &#39;&#39;, // 订单编号

     *      &#39;product_id&#39;    => &#39;&#39;, // 产品id(可用订单编号)

     * );

     */

    public static function h5Pay($order=NULL)

    {

        if(!is_array($order) || count($order) < 4){

            die("数组数据信息缺失!");

        }

        $order[&#39;trade_type&#39;] = &#39;MWEB&#39;; // H5支付

        $result = self::unifiedOrder($order);

        if ($result[&#39;return_code&#39;]==&#39;SUCCESS&#39; && $result[&#39;result_code&#39;]==&#39;SUCCESS&#39;)

            return $result[&#39;mweb_url&#39;]; // 返回链接让用户点击跳转

        if ($result[&#39;err_code_des&#39;])

            die($result[&#39;err_code_des&#39;]);

        return false;

    }

    /**

     * [Refund 微信支付退款]

     * @param  [type] $order [订单信息]

     * @param  [type] $type  [是否是小程序]

     * $order = array(

     *      &#39;body&#39;          => &#39;&#39;, // 退款原因

     *      &#39;total_fee&#39;     => &#39;&#39;, // 商品价格(分)

     *      &#39;out_trade_no&#39;  => &#39;&#39;, // 订单编号

     *      &#39;transaction_id&#39;=> &#39;&#39;, // 微信订单号

     * );

     */

    public static function Refund($order, $type=NULL)

    {

        $config = self::$config;

        $data = array(

            &#39;appid&#39;         => empty($type) ? $config[&#39;appid&#39;] : $config[&#39;xcxappid&#39;] ,

            &#39;mch_id&#39;        => $config[&#39;mch_id&#39;],

            &#39;nonce_str&#39;     => &#39;test&#39;,

            &#39;total_fee&#39;     => $order[&#39;total_fee&#39;],         //订单金额     单位 转为分

            &#39;refund_fee&#39;    => $order[&#39;total_fee&#39;],         //退款金额 单位 转为分

            &#39;sign_type&#39;     => &#39;MD5&#39;,                       //签名类型 支持HMAC-SHA256和MD5,默认为MD5

            &#39;transaction_id&#39;=> $order[&#39;transaction_id&#39;],    //微信订单号

            &#39;out_trade_no&#39;  => $order[&#39;out_trade_no&#39;],      //商户订单号

            &#39;out_refund_no&#39; => $order[&#39;out_trade_no&#39;],      //商户退款单号

            &#39;refund_desc&#39;   => $order[&#39;body&#39;],              //退款原因(选填)

        );

        // $unified[&#39;sign&#39;] = self::makeSign($unified, $config[&#39;KEY&#39;]);

        $sign = self::makeSign($data);

        $data[&#39;sign&#39;] = $sign;

        $xml = self::array_to_xml($data);

        $url = &#39;https://api.mch.weixin.qq.com/secapi/pay/refund&#39;;//接收xml数据的文件

        $response = self::postXmlSSLCurl($xml,$url);

        $result = self::xml_to_array($response);

        // 显示错误信息

        if ($result[&#39;return_code&#39;]==&#39;FAIL&#39;) {

            die($result[&#39;return_msg&#39;]);

        }

        $result[&#39;sign&#39;] = $sign;

        $result[&#39;nonce_str&#39;] = &#39;test&#39;;

        return $result;

    }

    /**

     * [notify 回调验证]

     * @return [array] [返回数组格式的notify数据]

     */

    public static function notify()

    {

        $xml = file_get_contents(&#39;php://input&#39;, &#39;r&#39;); // 获取xml

        if (!$xml)

            die(&#39;暂无回调信息&#39;);

        $data = self::xml_to_array($xml); // 转成php数组

        $data_sign = $data[&#39;sign&#39;]; // 保存原sign

        unset($data[&#39;sign&#39;]); // sign不参与签名

        $sign = self::makeSign($data);

        // 判断签名是否正确  判断支付状态

        if ($sign===$data_sign && $data[&#39;return_code&#39;]==&#39;SUCCESS&#39; && $data[&#39;result_code&#39;]==&#39;SUCCESS&#39;) {

            $result=$data;

        }else{

            $result=false;

        }

        // 返回状态给微信服务器

        if ($result) {

            $str=&#39;<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>&#39;;

        }else{

            $str=&#39;<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>&#39;;

        }

        echo $str;

        return $result;

    }

    /**

     * [makeSign 生成签名]

     * 本方法不覆盖sign成员变量,如要设置签名需要调用SetSign方法赋值

     * @param  [type] $data [description]

     * @return [type]       [description]

     */

    public static function makeSign($data)

    {

        // 去空

        $data = array_filter($data);

        //签名步骤一:按字典序排序参数

        ksort($data);

        $string_a = http_build_query($data);

        $string_a = urldecode($string_a);

        //签名步骤二:在string后加入key

        $config = self::$config;

        $string_sign_temp = $string_a."&key=".$config[&#39;key&#39;];

        //签名步骤三:MD5加密

        $sign = md5($string_sign_temp);

        // 签名步骤四:所有字符转为大写

        $result = strtoupper($sign);

        return $result;

    }

    /**

     * [xml_to_array 将xml转为array]

     * @param  [type] $xml [xml字符串]

     * @return [type]      [转换得到的数组]

     */

    public static function xml_to_array($xml)

    {

        //禁止引用外部xml实体

        libxml_disable_entity_loader(true);

        $result = json_decode(json_encode(simplexml_load_string($xml, &#39;SimpleXMLElement&#39;, LIBXML_NOCDATA)), true);

        return $result;

    }

    /**

     * [array_to_xml 输出xml字符]

     * @param  [type] $data [description]

     * @return [type]       [description]

     */

    public static function array_to_xml($data)

    {

        if(!is_array($data) || count($data) <= 0){

            die("数组数据异常!");

        }

        $xml = "<xml>";

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

            if (is_numeric($val)){

                $xml .= "<".$key.">".$val."</".$key.">";

            }else{

                $xml .= "<".$key."><![CDATA[".$val."]]></".$key.">";

            }

        }

        $xml .= "</xml>";

        return $xml;

    }

    /**

     * [curl_get_contents get请求]

     * @param  [type] $url [请求地址]

     * @return [type]      [description]

     */

    public static function curl_get_contents($url)

    {

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);                //设置访问的url地址

        // curl_setopt($ch,CURLOPT_HEADER,1);               //是否显示头部信息

        curl_setopt($ch, CURLOPT_TIMEOUT, 5);               //设置超时

        curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER[&#39;HTTP_USER_AGENT&#39;]);   //用户访问代理 User-Agent

        curl_setopt($ch, CURLOPT_REFERER, self::$referer);        //设置 referer

        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);        //跟踪301

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        //返回结果

        $r=curl_exec($ch);

        curl_close($ch);

        return $r;

    }

    /**

     * [postXmlSSLCurl 需要使用证书的请求]

     * @param  [type]  $xml    [xml数据]

     * @param  [type]  $url    [post请求地址]

     * @param  integer $second [description]

     * @return [type]          [description]

     */

    public static 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);

        //设置证书

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

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

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

        curl_setopt($ch,CURLOPT_SSLCERT, self::$sslcert_path);

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

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

        curl_setopt($ch,CURLOPT_SSLKEY, self::$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>";

            curl_close($ch);

            return false;

        }

    }

    /** fengkui.net

     * [get_rand_str 获取随机字符串]

     * @param  integer $randLength    [长度]

     * @param  integer $addtime       [是否加入当前时间戳]

     * @param  integer $includenumber [是否包含数字]

     * @return [type]                 [description]

     */

    public static function get_rand_str($randLength=6,$addtime=1,$includenumber=0)

    {

        if ($includenumber)

            $chars=&#39;abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQEST123456789&#39;;

        $chars=&#39;abcdefghijklmnopqrstuvwxyz&#39;;

        $len=strlen($chars);

        $randStr=&#39;&#39;;

        for ($i=0;$i<$randLength;$i++){

            $randStr .= $chars[rand(0,$len-1)];

        }

        $tokenvalue = $randStr;

        $addtime && $tokenvalue=$randStr.time();

        return $tokenvalue;

    }

    /** fengkui.net

     * [get_iP 定义一个函数get_iP() 客户端IP]

     * @return [type] [description]

     */

    public static function get_iP()

    {

        if (getenv("HTTP_CLIENT_IP"))

            $ip = getenv("HTTP_CLIENT_IP");

        else if(getenv("HTTP_X_FORWARDED_FOR"))

            $ip = getenv("HTTP_X_FORWARDED_FOR");

        else if(getenv("REMOTE_ADDR"))

            $ip = getenv("REMOTE_ADDR");

        else $ip = "Unknow";

        if(preg_match(&#39;/^((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1 -9]?\d))))$/&#39;, $ip))

            return $ip;

        else

            return &#39;&#39;;

    }

}

Copy after login

The above is the detailed content of Share a packaged PHP WeChat payment class library (code scanning, H5, mini program). For more information, please follow other related articles on the PHP Chinese website!

Related labels:
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Issues
php data acquisition?
From 1970-01-01 08:00:00
0
0
0
PHP extension intl
From 1970-01-01 08:00:00
0
0
0
How to learn php well
From 1970-01-01 08:00:00
0
0
0
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template