首页 后端开发 php教程 php实现微信支付之现金红包

php实现微信支付之现金红包

May 31, 2018 pm 04:23 PM
php 现金 红包

这篇文章主要为大家详细介绍了php实现微信支付之现金红包,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

直接运行该文件即可给指定的微信用户发送现金红包。

需要注意的事项:

1.微信现金红包要求必传证书,需要到这里 账户中心->账户设置->API安全->下载证书,然后修改代码中的证书路径

2.默认的使用场景是抽奖(即scene_id参数为PRODUCT_2),额度是1-200元,所以测试时的最低金额是1元。如需修改在产品中心->产品大全->现金红包->产品设置中修改

3.该文件需放到支付授权目录下,可以在微信支付商户平台->产品中心->开发配置中设置。

4.如提示签名错误可以通过微信支付签名验证工具进行验证:微信公众平台支付接口调试工具

5.错误码参照 :地址

代码如下:

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

<?php

/**

 * 关于微信现金红包的说明

 * 1.微信现金红包要求必传证书,需要到https://pay.weixin.qq.com 账户中心->账户设置->API安全->下载证书,证书路径在第214行和217行修改

 * 2.默认的使用场景是抽奖(即scene_id参数为PRODUCT_2),额度是1-200元,所以测试时的最低金额是1元。如需修改在产品中心->产品大全->现金红包->产品设置中修改

 * 3.错误码参照 :https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3

 */

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

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

$appid = 'xxxxx'; //微信支付申请对应的公众号的APPID

$appKey = 'xxxxx'; //微信支付申请对应的公众号的APP Key

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

 

//①、获取当前访问页面的用户openid(如果给指定用户发送红包,则填写指定用户的openid)

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

$openId = $wxPay->GetOpenid(); //获取openid

if(!$openId) exit('获取openid失败');

//②、发送红包

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

$payAmount = 1;  //红包金额,单位:元

$sendName = '织梦猫'; //红包发送者名称

$wishing = '感谢您参加猜灯谜活动,祝您元宵节快乐!'; //红包祝福语

$act_name='猜灯谜抢红包活动';  //活动名称

$result = $wxPay->createJsBizPackage($openId,$payAmount,$outTradeNo,$sendName,$wishing,$act_name);

echo 'success';

 

class WxpayService

{

 protected $mchid;

 protected $appid;

 protected $appKey;

 protected $apiKey;

 public $data = null;

 

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

 {

 $this->mchid = $mchid;

 $this->appid = $appid;

 $this->appKey = $appKey;

 $this->apiKey = $key;

 }

 

 /**

 * 通过跳转获取用户的openid,跳转流程如下:

 * 1、设置自己需要调回的url及其其他参数,跳转到微信服务器https://open.weixin.qq.com/connect/oauth2/authorize

 * 2、微信服务处理完成之后会跳转回用户redirect_uri地址,此时会带上一些参数,如:code

 * @return 用户的openid

 */

 public function GetOpenid()

 {

 //通过code获得openid

 if (!isset($_GET['code'])){

  //触发微信返回code码

  $scheme = $_SERVER['HTTPS']=='on' ? 'https://' : 'http://';

  $baseUrl = urlencode($scheme.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']);

  $url = $this->__CreateOauthUrlForCode($baseUrl);

  Header("Location: $url");

  exit();

 } else {

  //获取code码,以获取openid

  $code = $_GET['code'];

  $openid = $this->getOpenidFromMp($code);

  return $openid;

 }

 }

 

 /**

 * 通过code从工作平台获取openid机器access_token

 * @param string $code 微信跳转回来带上的code

 * @return openid

 */

 public function GetOpenidFromMp($code)

 {

 $url = $this->__CreateOauthUrlForOpenid($code);

 $res = self::curlGet($url);

 //取出openid

 $data = json_decode($res,true);

 $this->data = $data;

 $openid = $data['openid'];

 return $openid;

 }

 

 /**

 * 构造获取open和access_toke的url地址

 * @param string $code,微信跳转带回的code

 * @return 请求的url

 */

 private function __CreateOauthUrlForOpenid($code)

 {

 $urlObj["appid"] = $this->appid;

 $urlObj["secret"] = $this->appKey;

 $urlObj["code"] = $code;

 $urlObj["grant_type"] = "authorization_code";

 $bizString = $this->ToUrlParams($urlObj);

 return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString;

 }

 

 /**

 * 构造获取code的url连接

 * @param string $redirectUrl 微信服务器回跳的url,需要url编码

 * @return 返回构造好的url

 */

 private function __CreateOauthUrlForCode($redirectUrl)

 {

 $urlObj["appid"] = $this->appid;

 $urlObj["redirect_uri"] = "$redirectUrl";

 $urlObj["response_type"] = "code";

 $urlObj["scope"] = "snsapi_base";

 $urlObj["state"] = "STATE"."#wechat_redirect";

 $bizString = $this->ToUrlParams($urlObj);

 return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;

 }

 

 /**

 * 拼接签名字符串

 * @param array $urlObj

 * @return 返回已经拼接好的字符串

 */

 private function ToUrlParams($urlObj)

 {

 $buff = "";

 foreach ($urlObj as $k => $v)

 {

  if($k != "sign") $buff .= $k . "=" . $v . "&";

 }

 $buff = trim($buff, "&");

 return $buff;

 }

 

 /**

 * 发送红包

 * @param string $openid 用户在该公众号下的Openid

 * @param float $totalFee 红包金额 单位元

 * @param string $outTradeNo 订单号

 * @param string $orderName 红包发送者名称

 * @param string $wishing 祝福语

 * @param string $actName 互动名称

 * @return string

 */

 public function createJsBizPackage($openid, $totalFee, $outTradeNo, $sendName,$wishing,$actName)

 {

 $config = array(

  'mch_id' => $this->mchid,

  'appid' => $this->appid,

  'key' => $this->apiKey,

 );

 $unified = array(

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

  'send_name' => $sendName,

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

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

  're_openid' => $openid,

  'mch_billno' => $outTradeNo,

  'client_ip' => '127.0.0.1',

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

  'total_num'=>1,   //红包发放总人数

  'wishing'=>$wishing//红包祝福语

  'act_name'=>$actName//活动名称

  'remark'=>'remark',  //备注信息,如为中文注意转为UTF8编码

  'scene_id'=>'PRODUCT_2', //发放红包使用场景,红包金额大于200时必传。https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3

 );

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

 $responseXml = $this->curlPost('https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack', 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);

 }

 return true;

 }

 

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

 

 //第一种方法,cert 与 key 分别属于两个.pem文件

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

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

 curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/cert/apiclient_cert.pem');

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

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

 curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/cert/apiclient_key.pem');

 //第二种方式,两个文件合成一个.pem文件

// curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');

 $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;

 }

}

?>

登录后复制

以上就是本篇文章的全部内容了,感谢大家阅读。更多请关注PHP中文网!

相关推荐:

php实现微信支付之企业付款

php实现微信支付之退款功能

以上是php实现微信支付之现金红包的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章

两个点博物馆:邦格荒地地点指南
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章

两个点博物馆:邦格荒地地点指南
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热门文章标签

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 Dec 24, 2024 pm 04:42 PM

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南

CakePHP 日期和时间 CakePHP 日期和时间 Sep 10, 2024 pm 05:27 PM

CakePHP 日期和时间

CakePHP 文件上传 CakePHP 文件上传 Sep 10, 2024 pm 05:27 PM

CakePHP 文件上传

CakePHP 路由 CakePHP 路由 Sep 10, 2024 pm 05:25 PM

CakePHP 路由

讨论 CakePHP 讨论 CakePHP Sep 10, 2024 pm 05:28 PM

讨论 CakePHP

CakePHP 快速指南 CakePHP 快速指南 Sep 10, 2024 pm 05:27 PM

CakePHP 快速指南

CakePHP 项目配置 CakePHP 项目配置 Sep 10, 2024 pm 05:25 PM

CakePHP 项目配置

CakePHP 创建验证器 CakePHP 创建验证器 Sep 10, 2024 pm 05:26 PM

CakePHP 创建验证器

See all articles