微信扫码支付(原生php)

网上的很多PHP微信扫码支付接入教程都颇为复杂,且需要配置和引入较多的文件,本人通过整理后给出一个单文件版的,只有200行代码,希望可以给各位想接入微信扫码支付的带来些许帮助和借鉴意义。

直接运行该文件即可得到一个支付二维码的图片。

需要注意的事项:

1.该文件需放到支付授权目录下,可以在微信支付商户平台->产品中心->开发配置中设置。 
2.如提示签名错误可以通过微信支付签名验证工具进行验证:微信公众平台支付接口调试工具

代码如下:

?

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

<?php

header('Content-type:text/html; Charset=utf-8');

$mchid = 'xxxxx';     //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送

$appid = 'xxxxx'; //公众号APPID 通过微信支付商户资料审核后邮件发送

$apiKey = 'xxxxx'//https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥

$wxPay = new WxpayService($mchid,$appid,$apiKey);

$outTradeNo = uniqid();   //你自己的商品订单号

$payAmount = 0.01;     //付款金额,单位:元

$orderName = '支付测试'//订单标题

$notifyUrl = 'https://www.xxx.com/wx/';   //付款成功后的回调地址(不要有问号)

$payTime = time();   //付款时间

$arr = $wxPay->createJsBizPackage($payAmount,$outTradeNo,$orderName,$notifyUrl,$payTime);

//生成二维码

$url = 'http://qr.liantu.com/api.php?text='.$arr['code_url'];

echo "<img src='{$url}' style='width:300px;'>";

 

class WxpayService

{

  protected $mchid;

  protected $appid;

  protected $apiKey;

 

  public function __construct($mchid, $appid, $key)

  {

    $this->mchid = $mchid;

    $this->appid = $appid;

    $this->apiKey = $key;

  }

 

  /**

   * 发起订单

   * @param float $totalFee 收款总费用 单位元

   * @param string $outTradeNo 唯一的订单号

   * @param string $orderName 订单名称

   * @param string $notifyUrl 支付结果通知url 不要有问号

   * @param string $timestamp 订单发起时间

   * @return array

   */

  public function createJsBizPackage($totalFee, $outTradeNo, $orderName, $notifyUrl, $timestamp)

  {

    $config = array(

      'mch_id' => $this->mchid,

      'appid' => $this->appid,

      'key' => $this->apiKey,

    );

    $orderName = iconv('GBK','UTF-8',$orderName);

    $unified = array(

      'appid' => $config['appid'],

      'attach' => 'pay',       //商家数据包,原样返回,如果填写中文,请注意转换为utf-8

      'body' => $orderName,

      'mch_id' => $config['mch_id'],

      'nonce_str' => self::createNonceStr(),

      'notify_url' => $notifyUrl,

      'out_trade_no' => $outTradeNo,

      'spbill_create_ip' => '127.0.0.1',

      'total_fee' => intval($totalFee * 100),    //单位 转为分

      'trade_type' => 'NATIVE',

    );

    $unified['sign'] = self::getSign($unified, $config['key']);

    $responseXml = self::curlPost('https://api.mch.weixin.qq.com/pay/unifiedorder', self::arrayToXml($unified));

    $unifiedOrder = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);

    if ($unifiedOrder === false) {

      die('parse xml error');

    }

    if ($unifiedOrder->return_code != 'SUCCESS') {

      die($unifiedOrder->return_msg);

    }

    if ($unifiedOrder->result_code != 'SUCCESS') {

      die($unifiedOrder->err_code);

    }

    $codeUrl = (array)($unifiedOrder->code_url);

    if(!$codeUrl[0]) exit('get code_url error');

    $arr = array(

      "appId" => $config['appid'],

      "timeStamp" => $timestamp,

      "nonceStr" => self::createNonceStr(),

      "package" => "prepay_id=" . $unifiedOrder->prepay_id,

      "signType" => 'MD5',

      "code_url" => $codeUrl[0],

    );

    $arr['paySign'] = self::getSign($arr, $config['key']);

    return $arr;

  }

 

 

  public function notify()

  {

    $config = array(

      'mch_id' => $this->mchid,

      'appid' => $this->appid,

      'key' => $this->apiKey,

    );

    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

 

    $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

    if ($postObj === false) {

      die('parse xml error');

    }

    if ($postObj->return_code != 'SUCCESS') {

      die($postObj->return_msg);

    }

    if ($postObj->result_code != 'SUCCESS') {

      die($postObj->err_code);

    }

    $arr = (array)$postObj;

    unset($arr['sign']);

    if (self::getSign($arr, $config['key']) == $postObj->sign) {

      echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';

      return $postObj;

    }

  }

 

  /**

   * curl get

   *

   * @param string $url

   * @param array $options

   * @return mixed

   */

  public static function curlGet($url = '', $options = array())

  {

    $ch = curl_init($url);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    curl_setopt($ch, CURLOPT_TIMEOUT, 30);

    if (!empty($options)) {

      curl_setopt_array($ch, $options);

    }

    //https请求 不验证证书和host

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

    $data = curl_exec($ch);

    curl_close($ch);

    return $data;

  }

 

  public static function curlPost($url = '', $postData = '', $options = array())

  {

    if (is_array($postData)) {

      $postData = http_build_query($postData);

    }

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    curl_setopt($ch, CURLOPT_POST, 1);

    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);

    curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数

    if (!empty($options)) {

      curl_setopt_array($ch, $options);

    }

    //https请求 不验证证书和host

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

    $data = curl_exec($ch);

    curl_close($ch);

    return $data;

  }

 

  public static function createNonceStr($length = 16)

  {

    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

    $str = '';

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

      $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);

    }

    return $str;

  }

 

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

  }

  /**

   * 获取签名

   */

  public static function getSign($params, $key)

  {

    ksort($params, SORT_STRING);

    $unSignParaString = self::formatQueryParaMap($params, false);

    $signStr = strtoupper(md5($unSignParaString . "&key=" . $key));

    return $signStr;

  }

 

  protected static function formatQueryParaMap($paraMap, $urlEncode = false)

  {

    $buff = "";

    ksort($paraMap);

    foreach ($paraMap as $k => $v) {

      if (null != $v && "null" != $v) {

        if ($urlEncode) {

          $v = urlencode($v);

        }

        $buff .= $k . "=" . $v . "&";

      }

    }

    $reqPar = '';

    if (strlen($buff) > 0) {

      $reqPar = substr($buff, 0, strlen($buff) - 1);

    }

    return $reqPar;

  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值