发送红包失败!微信公众号发放红包红包返回失败!!NO_AUTH!发放失败,此请求可能存在风险,已被微信公众号发放红包拦截

摇一摇红包 - 微名汇 - 博客园
摇一摇周边红包接口是为线下商户提供的发红包功能。用户可以在商家门店等线下场所通过摇一摇周边领取商家发放的红包,在线上转发分享无效。
开发者可通过接口开发摇一摇红包功能,特点包括:
可选择使用模板加载页或自定义Html5页面调起微信原生红包页面(详见创建红包活动中use_template字段,1为使用模板,2为使用自定义Html5页面)
原生红包页面拆红包,无需通过公众号消息下发
提供关注公众号能力,用户可自行选择是否关注(裂变红包分享时无效)
完成页面可配置跳转链接,可跳转商户的其他自定义Html5页面
同一个用户在单个红包活动中只能领取1次红包
用户侧交互流程
红包组件接口调用流程
申请红包接口权限:登录摇一摇周边商户后台&,进入开发者支持,申请开通摇一摇红包组件接口;
红包预下单:调用微信支付的api进行红包预下单,告知需要发放的红包金额,人数,生成红包ticket;
创建活动并录入红包信息:调用摇周边平台的api录入创建红包活动并录入信息,传入预下单时生成的红包ticket;
调用jsapi抽红包:在摇出的页面中通过调用jsapi抽红包,抽中红包的用户可以拆红包;
调用以上接口时,红包提供商户和红包发放商户公众号要求一致。
红包提供商户:红包预下单接口传入的参数wxappid所代表的商户
红包发放商户:调用红包接口创建红包活动、录入红包信息、发放红包的商户公众号
设置单个红包的金额,类型等,生成红包信息。预下单完成后,需要在72小时内调用jsapi完成抽红包的操作。(红包过期失效后,资金会退回到商户财付通帐号。)
接口调用说明
服务器端调用
http请求方式: POST
POST数据格式:XML
需要商户证书
请求参数说明
参数字段是否必须示例值类型说明
随机字符串
5K8264ILTKCH16CQ2502SI8Z
String(32)
随机字符串,不长于32位
C380BEC2BFD727A4B
String(32)
生成签名方式查看签名算法
商户订单号
mch_billno
String(28)
商户订单号(每个订单号必须唯一)组成: mch_id+yyyymmdd+10位一天内不能重复的数字。接口根据商户订单号支持重入, 如出现超时可再调用。
String(32)
红包提供者的商户号(微信支付分配的商户号)
公众账号appid
String(32)
红包提供者公众号的appid,对应头像展示在红包页面
String(32)
红包提供者名称,展示在红包页面
String(16)
NORMAL-普通红包;GROUP-裂变红包(可分享红包给好友,无关注公众号能力)。
total_amount
总付款金额,单位分
红包发放总人数
红包发放总人数,即总共有多少人可以领到该组红包(包括分享者)。普通红包填1,裂变红包必须大于1。
红包金额设置方式
String(32)
红包金额设置方式,只对裂变红包生效。ALL_RAND&全部随机
红包祝福语
感谢您参加猜灯谜活动,祝您元宵节快乐
String(16)
红包祝福语,展示在红包页面
猜灯谜抢红包活动
String(32)
活动名称,在不支持原生红包的微信版本中展示在红包消息
猜越多得越多,快来抢!
String(32)
备注信息,在不支持原生红包的微信版本中展示在红包消息
授权商户号
auth_mchid
String(32)
用于发红包时微信支付识别摇周边红包,所有开发者统一填写摇周边平台的商户号:
授权商户APPID
auth_appid
wxbf42bd79c4391863
String(32)
用于发红包时微信支付识别摇周边红包,所有开发者统一填写摇周边平台的appid:wxbf42bd79c4391863
String(32)
用于管控接口风险。具体值如下:NORMAL&正常情况;IGN_FREQ_LMT&忽略防刷限制,强制发放;IGN_DAY_LMT&忽略单用户日限额限制,强制发放;IGN_FREQ_DAY_LMT&忽略防刷和单用户日限额限制,强制发放;如无特殊要求,请设为NORMAL。若忽略某项风险控制,可能造成资金损失,请谨慎使用。
&sign&&![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]&&/sign&
&mch_billno&&![CDATA[6545]]&&/mch_billno&
&mch_id&&![CDATA[]]&&/mch_id&
&wxappid&&![CDATA[wxcbda96de0b165486]]&&/wxappid&
&send_name&&![CDATA[send_name]]&&/send_name&
&hb_type&&![CDATA[NORMAL]]&&/hb_type&
&auth_mchid&&![CDATA[]]&&/auth_mchid&
&auth_appid&&![CDATA[wx7777777]]&&/auth_appid&
&total_amount&&![CDATA[200]]&&/total_amount&
&amt_type&&![CDATA[ALL_RAND]]&&/amt_type&
&total_num&&![CDATA[3]]&&/total_num&
&wishing&&![CDATA[恭喜发财 ]]&&/wishing&
&act_name&&![CDATA[ 新年红包 ]]&&/act_name&
&remark&&![CDATA[新年红包 ]]&&/remark&
&risk_cntl&&![CDATA[NORMAL]]&&/risk_cntl&
&nonce_str&&![CDATA[50780e0cca98c8c8ecaa672e]]&&/nonce_str&
返回数据说明
返回格式为xml
参数字段是否必须示例值类型说明
返回状态码
return_code
String(16)
SUCCESS/FAIL;此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断
return_msg
String(128)
返回信息,如非空,为错误原因 签名失败 参数格式校验错误
以下字段在return_code为SUCCESS的时候有返回
参数字段是否必须示例值类型说明
C380BEC2BFD727A4BF3AD6
String(32)
生成签名方式查看 签名算法
result_code
String(16)
SUCCESS/FAIL
String(32)
错误码信息
错误代码描述
err_code_des
String(128)
结果信息描述
以下字段在return_code 和result_code都为SUCCESS的时候有返回
参数字段是否必须示例值类型说明
商户订单号
mch_billno
String(28)
商户订单号(每个订单号必须唯一)组成: mch_id+yyyymmdd+10位一天内不能重复的数字。
String(32)
微信支付分配的商户号
公众账号appid
String(32)
total_amount
总付款金额,单位分
2J6MtR+SlbZ8Ga4EDi64X5
vC4Xv01ofX4uWOqqTc9kGJYhkq5 st5ucrXKxkjnC/UuvLeuhdIfiYg i4hJuJ95qjt9mwxqSBEmjGbZlL+ sqM9upoWsEjup28KPvaVrdao/Hg 6WqyqUL5E2zPHfM1sb1w==
sp_ticket,一个普通红包对应一个ticket
红包订单号
红包内部订单号
红包发放时间
&return_code&&![CDATA[SUCCESS]]&&/return_code&
&return_msg&&![CDATA[发放成功.]]&&/return_msg&
&result_code&&![CDATA[SUCCESS]]&&/result_code&
&err_code&&![CDATA[0]]&&/err_code&
&err_code_des&&![CDATA[发放成功.]]&&/err_code_des&
&mch_billno&&![CDATA[6545]]&&/mch_billno&
&mch_id&&/mch_id&
&wxappid&&![CDATA[wx6fa7e3bab7e15415]]&&/wxappid&
&sp_ticket&&![CDATA[0cca98c8c8e814883]]&&/sp_ticket&
&total_amount&3&/total_amount&
&detail_id&&![CDATA[888]]&&/detail_id&
&send_time&&![CDATA[00]]&&/send_time&
&return_code&&![CDATA[FAIL]]&&/return_code&
&return_msg&&![CDATA[系统繁忙,请稍后再试.]]&&/return_msg&
&result_code&&![CDATA[FAIL]]&&/result_code&
&err_code&&![CDATA[]]&&/err_code&
&err_code_des&&![CDATA[系统繁忙,请稍后再试.]]&&/err_code_des&
&mch_billno&&![CDATA[6542]]&&/mch_billno&
&mch_id&&/mch_id&
&wxappid&&![CDATA[wx6fa7e3bab7e15415]]&&/wxappid&
&total_amount&3&/total_amount&
错误代码描述解决方案
请求未携带证书,或请求携带的证书出错
到商户平台下载证书,请求带上证书后重试。
SIGN_ERROR
商户签名错误
按文档要求重新生成签名后再重试。
请联系微信支付开通api权限。
FREQ_LIMIT
受频率限制
请对请求做频率控制
请求的xml格式错误,或者post的数据为空
检查请求串,确认无误后重试
PARAM_ERROR
请查看err_code_des,修改设置错误的参数
OPENID_ERROR
Openid错误
根据用户在商家公众账号上的openid,获取用户在红包公众账号上的openid 错误。请核对商户自身公众号appid和用户在此公众号下的openid。
商户账号余额不足,请登录微信支付商户平台充值
FATAL_ERROR
重复请求时,参数与原单不一致
使用相同商户单号进行重复请求时,参数与第一次请求时不一致,请检查并修改参数后再重试。
TIME _LIMITED
企业红包的发送时间受限
请北京时间0:00-8:00时间之外触发红包赠送
SECOND_OVER_LIMITED
企业红包的按分钟发放受限
每分钟发送红包数量不得超过1800个;(可联系微信支付调高额度)
DAY_ OVER_LIMITED
企业红包的按天日发放受限
单个商户日发送红包数量不大于10000个;(可联系微信支付调高额度)
MONEY_LIMIT
红包金额发放限制
每个红包金额必须大于1元,小于1000元(可联系微信支付调高额度至4999元)
SEND_FAILED
红包发放失败,请更换单号再重试。
原商户单号已经失败,如果还要对同一个用户发放红包, 需要更换新的商户单号再试。
SYSTEMERROR
系统繁忙,请再试。
可用同一商户单号再次调用,只会发放一个红包。
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2&)拼接成字符串stringA。
特别注意以下重要规则:
参数名ASCII码从小到大排序(字典序);
如果参数的值为空不参与签名;
参数名区分大小写;
验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
第二步,在stringA最后拼接上key=商户支付密钥得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
假设传送的参数如下:
appid: wxd930ea5d5a258f4f
device_info: 1000
Body: test
nonce_str: ibuaiVcKdpRxkhJA
第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=&nonce_str=ibuaiVcKdpRxkhJA";
第二步:拼接支付密钥:
stringSignTemp="stringA&key=c09247ec02edce69f6a2d"
sign=MD5(stringSignTemp).toUpperCase()="9A0AA9CF3B7"
最终得到最终发送的数据:
&appid&wxd930ea5d5a258f4f&/appid&
&mch_id&&/mch_id&
&device_info&1000&/device_info&
&body&test&/body&
&nonce_str&ibuaiVcKdpRxkhJA&/nonce_str&
&sign&9A0AA9CF3B7&/sign&
生成随机数算法
微信支付API接口协议中包含固定nonce_str,主要保证签名不可预测。我们推荐生成随机数算法如下:
调用随机数生成函数,将得到的值转换为字符串。
1. 获取商户证书
微信支付接口中,涉及资金回滚的接口会使用到商户证书,包括退款、撤销接口。商家在申请微信支付成功后,收到的相应邮件通知中,附件会包含接口需要用到的证书文件,有四个证书文件,分别说明如下。
证书文件说明:
证书附件描述使用场景备注
pkcs12格式(apiclient_cert.p12)
包含了私钥信息的证书文件,为p12(pfx)格式,由微信支付签发给您用来标识和界定您的身份
撤销、退款申请API中调用
windows上可以直接双击导入系统,导入过程中会提示输入证书密码,证书密码默认为您的商户ID(如:)
证书pem格式(apiclient_cert.pem)
从apiclient_cert.p12中导出证书部分的文件,为pem格式,请妥善保管不要泄漏和被他人复制
PHP等不能直接使用p12文件,而需要使用pem,为了方便您使用,已为您直接提供
您也可以使用openssl命令来自己导出:openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem
证书密钥pem格式(apiclient_key.pem)
从apiclient_cert.p12中导出密钥部分的文件,为pem格式
PHP等不能直接使用p12文件,而需要使用pem,为了方便您使用,已为您直接提供
您也可以使用openssl命令来自己导出:openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem
CA证书(rootca.pem)
微信支付api服务器上也部署了证明微信支付身份的服务器证书,您在使用api进行调用时也需要验证所调用服务器及域名的真实性
该文件为签署微信支付证书的权威机构的根证书,可以用来验证微信支付服务器证书的真实性
部分工具已经内置了若干权威机构的根证书,无需引用该证书也可以正常进行验证,这里提供给您在未内置所必须根证书的环境中载入使用
2. 使用商户证书
apiclient_cert.p12是商户证书文件,除PHP外的开发均使用此证书文件。
商户如果使用.NET环境开发,请确认Framework版本大于2.0,必须在操作系统上双击安装证书apiclient_cert.p12后才能被正常调用。
商户证书调用或安装都需要使用到密码,该密码的值为微信商户号(mchid)
PHP开发环境请使用商户证书文件apiclient_cert.pem和apiclient_key.pem ,rootca.pem是CA证书。
3. 商户证书安全
证书文件放在非web服务器虚拟目录的文件夹下,防止被他人下载。商户服务器要做好病毒和木马防护工作,不被非法侵入者窃取证书文件。
创建红包活动,设置红包活动有效期,红包活动开关等基本信息,返回活动id
接口调用说明
服务器端调用
http请求方式: POST
请求参数说明
参数类型说明
access_token
accesstoken,以参数的形式拼装在url后
use_template
是否使用模板,1:使用,2:不使用,以参数的形式拼装在url后。(模版即交互流程图中的红包加载页,使用模板用户不需要点击可自动打开红包;不使用模版需自行开发HTML5页面,并在页面调用红包jsapi)
使用模板页面的logo_url,不使用模板时可不加。展示在摇一摇界面的消息图标。图片尺寸为120x120。
POST BODY:JSON格式的结构体
参数类型说明
抽奖活动名称(选择使用模板时,也作为摇一摇消息主标题),最长6个汉字,12个英文字母。
抽奖活动描述(选择使用模板时,也作为摇一摇消息副标题),最长7个汉字,14个英文字母。
抽奖开关。0关闭,1开启,默认为1
begin_time
抽奖活动开始时间,unix时间戳,单位秒
expire_time
抽奖活动结束时间,unix时间戳,单位秒,红包活动有效期最长为91天
sponsor_appid
红包提供商户公众号的appid,需与预下单中的公众账号appid(wxappid)一致
红包总数,红包总数是录入红包ticket总数的上限,因此红包总数应该大于等于预下单时红包ticket总数。
红包关注界面后可以跳转到第三方自定义的页面
开发者自定义的key,用来生成活动抽奖接口的签名参数,长度32位。使用方式见sign生成规则
Content-Type: application/json Post Body:
"title": "title",
"desc": "desc",
"onoff": 1,
"begin_time": ,
"expire_time": ,
"sponsor_appid": "wxxxxxxxxxxxxxx",
"total": 10,
"jump_url": JUMP_URL,
"key": "keyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
返回数据说明
参数类型说明
错误码。0为成功,其他为失败。详细请参考错误码表
lottery_id
生成的红包活动id
生成的模板页面ID
"errcode":0,
"errmsg":"",
"lottery_id":"xxxxxxllllll",
"page_id":1,
在调用"创建红包活动"接口之后,调用此接口录入红包信息。注意,此接口每次调用,都会向某个活动新增一批红包信息,如果红包数少于100个,请通过一次调用添加所有红包信息。如果红包数大于100,可以多次调用接口添加。请注意确保多次录入的红包ticket总的数目不大于创建该红包活动时设置的total值。
接口调用说明
服务器端调用
http请求方式: POST
请求参数说明
参数类型说明
access_token
accesstoken,以参数的形式拼装在url后
POST BODY:JSON格式的结构体
参数类型说明
lottery_id
红包抽奖id,来自addlotteryinfo返回的lottery_id
红包提供者的商户号,,需与预下单中的商户号mch_id一致
sponsor_appid
红包提供商户公众号的appid,需与预下单中的公众账号appid(wxappid)一致
prize_info_list
红包ticket列表,如果红包数较多,可以一次传入多个红包,批量调用该接口设置红包信息。每次请求传入的红包个数上限为100
预下单时返回的红包ticket,单个活动红包ticket数量上限为100000个,可添加多次。
Content-Type: application/json Post Body:
"lottery_id": "xxxxxxllllll",
"mchid": "",
"sponsor_appid": "wx8888"
"prize_info_list": [
"ticket": "v1|ZiPs2l0hpMBp3uwGI1rwp45vOdz/V/zQ/00jP9MeWT+e47/q1FJjwCIP34frSjzOxAEzJ7k2CtAg1pmcShvkChBWqbThxPm6MBuzceoHtj79iHuHaEn0WAO+j4sXnXnbGswFOlDYWg1ngvrRYnCY3g==",
返回数据说明
参数类型说明
错误码。0为成功,其他为失败。详细请参考错误码表
repeat_ticket_list
重复使用的ticket列表,如为空,将不返回
expire_ticket_list
过期的ticket列表,如为空,将不返回
invalid_amount_ticket_list
金额不在大于1元,小于1000元的ticket列表,如为空,将不返回
success_num
成功录入的红包数量
wrong_authmchid_ticket_list
原因:生成红包的时候,授权商户号auth_mchid和auth_appid没有写摇周边的商户号
invalid_ticket_list
ticket解析失败,可能有错别字符或不完整
"errcode":0,
"errmsg":"",
"repeat_ticket_list":[
"ticket": "v1|ZiPs2l0hpMBp3uwGI1rwp45vOdz/V/zQ/00jP9MeWT+e47/q1FJjwCIP34frSjzOxAEzJ7k2CtAg1pmcShvkChBWqbThxPm6MBuzceoHtj79iHuHaEn0WAO+j4sXnXnbGswFOlDYWg1ngvrRYnCY3g==",
"success_num":100
开发者实时控制红包活动抽奖的开启和关闭。注意活动抽奖开关只在红包活动有效期之内才能生效,如果不能确定红包活动有效期,请尽量将红包活动有效期的范围设置大。
接口调用说明
服务器端调用
http请求方式: Get
请求参数说明
参数类型说明
access_token
accesstoken,以参数的形式拼装在url后
lottery_id
红包抽奖id,来自addlotteryinfo返回的lottery_id
活动抽奖开关,0:关闭,1:开启
返回数据说明
参数类型说明
错误码。0为成功,其他为失败。详细请参考错误码表
"errcode":0,
"errmsg":""
在第三方页面中,通过调用JSAPI来触发用户抽红包的操作,如果抽到红包,会呼出微信的原生红包页面。用户只有通过摇周边的入口才能抽中红包。每个用户在一个活动抽奖id下最多只能中一个红包。创建红包活动时,选择使用模板页面的开发者不需要调用该接口
引入BeaconShakehbJsBridge'
&scripttype="text/javascript"src=""&
API详细说明
抽红包JS API调用与微信的JS API调用格式一致,如下:
函数:invoke
用途:主动调用指定API
通用形式:BeaconShakehbJsBridge.invoke("API名称", {调用参数});
API 名称:jumpHongbao
参数:openid、lottery_id、noncestr、sign
回调函数:无
调用参数说明
用户openid。必填
lottery_id
红包抽奖id,必填,来自addlotteryinfo返回的lottery_id
随机字符串,不长于32位。必填
签名,详见下面的签名生成规则
Sign生成规则
1.除sign字段外,所有参数按照字段名的ASCII码从小到大排序后(字典序),使用URL键值对的格式(即Param1=value1&Param2=value2&)拼接而成签名原始串,空值不参与签名组串。
2.签名原始串中,字段名和字段值都采用原始值,不进行URL转义。
3.签名原始串末尾补上key参数(通过&创建红包活动&接口设置的key),如 Param1=value1&Param2=value2&&key=keyvalue
4.得到的字符串进行MD5,并转换为大写。即
sign=ToUpperCase(MD5(Param1=value1&Param2=value2&&key=keyvalue))
5.出于安全考虑,开发者必须在服务器端实现生成签名的逻辑。
BeaconShakehbJsBridge.ready(function(){
//跳转到抽红包页面
BeaconShakehbJsBridge.invoke('jumpHongbao',{
lottery_id:'LOTTERY_ID ',
noncestr:'507217',
openid:'OPENID',
sign:'SIGN'
用户侧错误码说明
提示文案错误码错误信息解决方案
摇周边ticket过期
检查是不是从微信摇一摇进入
摇一摇ticket不存在
检查是不是从微信摇一摇进入
无效的摇一摇ticket
检查是不是从微信摇一摇进入
获取商户appid失败
检查是不是从微信摇一摇进入
摇周边频率检查失败
检查是不是从微信摇一摇进入
随机字符串长度过长
对自定义页面时调jsapi参数校验出错,请检查
LotteryID解析失败
对自定义页面时调jsapi参数校验出错,请检查
签名校验失败
对自定义页面时调jsapi参数校验出错,请检查
openid无效
对自定义页面时调jsapi参数校验出错,请检查
pass_ticket无效
检查是不是从微信摇一摇进入
绑定用户和红包失败
抽到红包ticket后,微信支付返回的错误
微信支付查询红包ticket失败
抽到红包ticket后,微信支付返回的错误
抽奖操作频率过高
page_id无效
使用模版时校验出错
用户进入红包页面时,后台会将一个红包ticket和用户openid绑定,微信会把这个事件推送到开发者填写的URL(登录公众平台进入开发者中心设置)。推送内容包含用户openid,红包活动id,红包ticket、金额以及红包绑定时间。
注:红包绑定用户不等同于用户领取红包。用户进入红包页面后,有可能不拆红包,但该红包ticket已被绑定,不能再被其他用户绑定,过期后会退回商户财付通账户。
推送XML数据包示例
&ToUserName&&![CDATA[toUser]]&&/ToUserName&
&FromUserName&&![CDATA[fromUser]]&&/FromUserName&
&CreateTime&&/CreateTime&
&MsgType&&![CDATA[event]]&&/MsgType&
&Event&&![CDATA[ShakearoundLotteryBind]]&&/Event&
&LotteryId&&![CDATA[lotteryid]]&&/LotteryId&
&Ticket&&![CDATA[ticket]]&&/Ticket&
&Money&88&/Money&
&BindTime&&/BindTime&
调用参数说明
ToUserName
开发者微信号。
FromUserName
红包绑定用户(一个OpenID)。
CreateTime
消息创建时间 (整型)。
消息类型,event
事件类型,ShakearoundLotteryBind
红包活动id
红包ticket
红包绑定时间匿名用户不能发表回复!|今天看啥 热点:
微信摇一摇周边 红包,摇周边红包早上老大扔了个设备来说要做个摇一摇红包& 就上网找了下 强大的度娘都找不到大神们分享出来的源码 只能自己埋头去写写了
微信官方说明如下
摇一摇周边红包接口是为线下商户提供的发红包功能。用户可以在商家门店等线下场所通过摇一摇周边领取商家发放的红包,在线上转发分享无效。
开发者可通过接口开发摇一摇红包功能,特点包括:
用户侧交互流程
红包组件接口调用流程
红包提供商户:红包预下单接口传入的参数wxappid所代表的商户
红包发放商户:调用红包接口创建红包活动、录入红包信息、发放红包的商户公众号所以步骤应该是 ① 创建红包活动 ② 预下单 ③ 录入红包找出来了之前整理的类 在写一下1.创建活动
创建红包活动,设置红包活动有效期,红包活动开关等基本信息,返回活动id
接口调用说明
服务器端调用
http请求方式: POST
URL: https://api.weixin.qq.com/shakearound/lottery/addlotteryinfo?access_token=ACCESSTOKEN&use_template=1&logo_url=LOGO_URL
请求参数说明
参数类型说明
access_token
accesstoken,以参数的形式拼装在url后
use_template
是否使用模板,1:使用,2:不使用,以参数的形式拼装在url后。(模版即交互流程图中的红包加载页,使用模板用户不需要点击可自动打开红包;不使用模版需自行开发HTML5页面,并在页面调用红包jsapi)
使用模板页面的logo_url,不使用模板时可不加。展示在摇一摇界面的消息图标。图片尺寸为120x120。
POST BODY:JSON格式的结构体
参数类型说明
抽奖活动名称(选择使用模板时,也作为摇一摇消息主标题),最长6个汉字,12个英文字母。
抽奖活动描述(选择使用模板时,也作为摇一摇消息副标题),最长7个汉字,14个英文字母。
抽奖开关。0关闭,1开启,默认为1
begin_time
抽奖活动开始时间,unix时间戳,单位秒
expire_time
抽奖活动结束时间,unix时间戳,单位秒,红包活动有效期最长为91天
sponsor_appid
红包提供商户公众号的appid,需与预下单中的公众账号appid(wxappid)一致
红包总数,红包总数是录入红包ticket总数的上限,因此红包总数应该大于等于预下单时红包ticket总数。
红包关注界面后可以跳转到第三方自定义的页面
开发者自定义的key,用来生成活动抽奖接口的签名参数,长度32位。使用方式见sign生成规则
Content-Type: application/json Post Body:
"title": "title",
"desc": "desc",
"onoff": 1,
"begin_time": ,
"expire_time": ,
"sponsor_appid": "wxxxxxxxxxxxxxx",
"total": 10,
"jump_url": JUMP_URL,
"key": "keyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
返回数据说明
参数类型说明
错误码。0为成功,其他为失败。详细请参考错误码表
lottery_id
生成的红包活动id
生成的模板页面ID
"errcode":0,
"errmsg":"",
"lottery_id":"xxxxxxllllll",
"page_id":1,
* 摇一摇红包 创建活动
* @author jiosen
class addlotteryinfo_pub extends Wxpay_client_pub
var $//code码,用以获取openid
var $//用户的openid
function __construct($access_token,$logo)
//设置接口链接
$this-&url = "https://api.weixin.qq.com/shakearound/lottery/addlotteryinfo?access_token=".$access_token."&use_template=1&logo_url=".$
//设置curl超时时间
$this-&curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
* 生成接口参数
function createJson()
//检测必填参数
if($this-&parameters["title"] == null)
throw new SDKRuntimeException("缺少抽奖活动名称title!"."&br&");
}elseif ($this-&parameters["desc"] == null ) {
throw new SDKRuntimeException("缺少抽奖活动描述desc!"."&br&");
}elseif ($this-&parameters["begin_time"] == null) {
throw new SDKRuntimeException("缺少活动开始时间 begin_time!"."&br&");
}elseif ($this-&parameters["expire_time"] == null) {
throw new SDKRuntimeException("缺少活动结束时间 expire_time!"."&br&");
}elseif ($this-&parameters["total"] == null) {
throw new SDKRuntimeException("缺少红包总数total!"."&br&");
}elseif ($this-&parameters["jump_url"] == null) {
throw new SDKRuntimeException("缺少红包关注跳转连接jump_url!"."&br&");
}elseif ($this-&parameters["key"] == null) {
throw new SDKRuntimeException("缺少红包key!"."&br&");
$this-&parameters["title"] = urlencode($this-&parameters["title"]);
$this-&parameters["desc"] = urlencode($this-&parameters["desc"]);
$this-&parameters["onoff"] = '1';//开启活动
$this-&parameters["sponsor_appid"] = WxPayConf_pub::APPID;//公众账号ID
//var_dump($this-&parameters);
//echo json_encode($this-&parameters);
json_encode($this-&parameters);
}catch (SDKRuntimeException $e)
die($e-&errorMessage());
function hbpreorder()
$data = $this-&createJson();
$result = $this-&curl_post($this-&url,urldecode($data));
$result = json_decode($result);
function curl_post($url,$data)
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_POST, 1);//发送一个常规的Post请求
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);//Post提交的数据包
$rv = curl_exec($curl);//输出内容
curl_close($curl);
作用:生成可以获得code的url
function createOauthUrlForCode($redirectUrl)
$urlObj["appid"] = WxPayConf_pub::APPID;
$urlObj["redirect_uri"] = "$redirectUrl";
$urlObj["response_type"] = "code";
$urlObj["scope"] = "snsapi_base";
$urlObj["state"] = "STATE"."#wechat_redirect";
$bizString = $this-&formatBizQueryParaMap($urlObj, false);
return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizS
作用:生成可以获得openid的url
function createOauthUrlForOpenid()
$urlObj["appid"] = WxPayConf_pub::APPID;
$urlObj["secret"] = WxPayConf_pub::APPSECRET;
$urlObj["code"] = $this-&
$urlObj["grant_type"] = "authorization_code";
$bizString = $this-&formatBizQueryParaMap($urlObj, false);
return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizS
作用:通过curl向微信提交code,以获取openid
function getOpenid()
$url = $this-&createOauthUrlForOpenid();
//初始化curl
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOP_TIMEOUT, $this-&curl_timeout);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//运行curl,结果以jason形式返回
$res = curl_exec($ch);
curl_close($ch);
$data = json_decode($res,true);
$this-&openid = $data['openid'];
return $this-&
作用:设置code
function setCode($code_)
$this-&code = $code_;
&要注意提交的数据是json 不是xml
&前端页面随便做一下
$title = $_POST['title'];
$file = $_FILES['img'];
$tools = new Tools(); //这是一个文件上传类 随意选择一样你喜欢的上传方式
$logo_url = $tools-&_upload_award("poll_img", $file, time());
$description = $_POST['description'];
$total = $_POST['total'];
$jump_url = $_POST['jump_url'];
$token = getAccessToken();
//这里是我封装的一个获取 token的 方法
做了时间限制 防止超出调用次数
   $Redpack = new addlotteryinfo_pub($token,SITE_URL.$logo_url);
   $time = time();
   $end = time()+60*24*60*60;//两个月
这里的开始和结束时间我固定了
  $key = $Redpack-&createNoncestr(); //key
 $Redpack-&setParameter('title', $title);
//活动标题
$Redpack-&setParameter('desc', $description);
//活动描述
$Redpack-&setParameter('begin_time', $time);
//开始时间
$Redpack-&setParameter('expire_time', $end);
//结束时间
$Redpack-&setParameter('total', $total);
//红包总数
$Redpack-&setParameter('jump_url', $jump_url);
$Redpack-&setParameter('key', $key);
$result = $Redpack-&hbpreorder();
$result = (array)$
if($result['errcode']==0){
   $lottery_id = $result['lottery_id'];
$page_id = $result['page_id'];
//这里记得存一下数据库;
            
//echo '创建活动失败:'.$result['errmsg'];
//这里是错误提示
设置单个红包的金额,类型等,生成红包信息。预下单完成后,需要在72小时内调用jsapi完成抽红包的操作。(红包过期失效后,资金会退回到商户财付通帐号。)
接口调用说明
服务器端调用
http请求方式: POST
https://api.mch.weixin.qq.com/mmpaymkttransfers/hbpreorder
POST数据格式:XML
需要商户证书
请求参数说明
参数字段是否必须示例值类型说明
随机字符串
5K8264ILTKCH16CQ2502SI8Z
String(32)
随机字符串,不长于32位
C380BEC2BFD727A4B
String(32)
生成签名方式查看签名算法
商户订单号
mch_billno
String(28)
商户订单号(每个订单号必须唯一)组成: mch_id+yyyymmdd+10位一天内不能重复的数字。接口根据商户订单号支持重入, 如出现超时可再调用。
String(32)
红包提供者的商户号(微信支付分配的商户号)
公众账号appid
String(32)
红包提供者公众号的appid,对应头像展示在红包页面
String(32)
红包提供者名称,展示在红包页面
String(16)
NORMAL-普通红包;GROUP-裂变红包(可分享红包给好友,无关注公众号能力)。
total_amount
总付款金额,单位分
红包发放总人数
红包发放总人数,即总共有多少人可以领到该组红包(包括分享者)。普通红包填1,裂变红包必须大于1。
红包金额设置方式
String(32)
红包金额设置方式,只对裂变红包生效。ALL_RAND&全部随机
红包祝福语
感谢您参加猜灯谜活动,祝您元宵节快乐
String(16)
红包祝福语,展示在红包页面
猜灯谜抢红包活动
String(32)
活动名称,在不支持原生红包的微信版本中展示在红包消息
猜越多得越多,快来抢!
String(32)
备注信息,在不支持原生红包的微信版本中展示在红包消息
授权商户号
auth_mchid
String(32)
用于发红包时微信支付识别摇周边红包,所有开发者统一填写摇周边平台的商户号:
授权商户APPID
auth_appid
wxbf42bd79c4391863
String(32)
用于发红包时微信支付识别摇周边红包,所有开发者统一填写摇周边平台的appid:wxbf42bd79c4391863
String(32)
用于管控接口风险。具体值如下:NORMAL&正常情况;IGN_FREQ_LMT&忽略防刷限制,强制发放;IGN_DAY_LMT&忽略单用户日限额 限制,强制发放;IGN_FREQ_DAY_LMT&忽略防刷和单用户日限额限制,强制发放;如无特殊要求,请设为NORMAL。若忽略某项风险控制,可 能造成资金损失,请谨慎使用。
&sign&&![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]&&/sign&
&mch_billno&&![CDATA[6545]]&&/mch_billno&
&mch_id&&![CDATA[]]&&/mch_id&
&wxappid&&![CDATA[wxcbda96de0b165486]]&&/wxappid&
&send_name&&![CDATA[send_name]]&&/send_name&
&hb_type&&![CDATA[NORMAL]]&&/hb_type&
&auth_mchid&&![CDATA[]]&&/auth_mchid&
&auth_appid&&![CDATA[wx7777777]]&&/auth_appid&
&total_amount&&![CDATA[200]]&&/total_amount&
&amt_type&&![CDATA[ALL_RAND]]&&/amt_type&
&total_num&&![CDATA[3]]&&/total_num&
&wishing&&![CDATA[恭喜发财 ]]&&/wishing&
&act_name&&![CDATA[ 新年红包 ]]&&/act_name&
&remark&&![CDATA[新年红包 ]]&&/remark&
&risk_cntl&&![CDATA[NORMAL]]&&/risk_cntl&
&nonce_str&&![CDATA[50780e0cca98c8c8ecaa672e]]&&/nonce_str&
返回数据说明
返回格式为xml
参数字段是否必须示例值类型说明
返回状态码
return_code
String(16)
SUCCESS/FAIL;此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断
return_msg
String(128)
返回信息,如非空,为错误原因 签名失败 参数格式校验错误
以下字段在return_code为SUCCESS的时候有返回
参数字段是否必须示例值类型说明
C380BEC2BFD727A4BF3AD6
String(32)
生成签名方式查看 签名算法
result_code
String(16)
SUCCESS/FAIL
String(32)
错误码信息
错误代码描述
err_code_des
String(128)
结果信息描述
以下字段在return_code 和result_code都为SUCCESS的时候有返回
参数字段是否必须示例值类型说明
商户订单号
mch_billno
String(28)
商户订单号(每个订单号必须唯一)组成: mch_id+yyyymmdd+10位一天内不能重复的数字。
String(32)
微信支付分配的商户号
公众账号appid
String(32)
total_amount
总付款金额,单位分
2J6MtR+SlbZ8Ga4EDi64X5
vC4Xv01ofX4uWOqqTc9kGJYhkq5 st5ucrXKxkjnC/UuvLeuhdIfiYg i4hJuJ95qjt9mwxqSBEmjGbZlL+ sqM9upoWsEjup28KPvaVrdao/Hg 6WqyqUL5E2zPHfM1sb1w==
sp_ticket,一个普通红包对应一个ticket
红包订单号
红包内部订单号
红包发放时间
&return_code&&![CDATA[SUCCESS]]&&/return_code&
&return_msg&&![CDATA[发放成功.]]&&/return_msg&
&result_code&&![CDATA[SUCCESS]]&&/result_code&
&err_code&&![CDATA[0]]&&/err_code&
&err_code_des&&![CDATA[发放成功.]]&&/err_code_des&
&mch_billno&&![CDATA[6545]]&&/mch_billno&
&mch_id&&/mch_id&
&wxappid&&![CDATA[wx6fa7e3bab7e15415]]&&/wxappid&
&sp_ticket&&![CDATA[0cca98c8c8e814883]]&&/sp_ticket&
&total_amount&3&/total_amount&
&detail_id&&![CDATA[888]]&&/detail_id&
&send_time&&![CDATA[00]]&&/send_time&
&return_code&&![CDATA[FAIL]]&&/return_code&
&return_msg&&![CDATA[系统繁忙,请稍后再试.]]&&/return_msg&
&result_code&&![CDATA[FAIL]]&&/result_code&
&err_code&&![CDATA[]]&&/err_code&
&err_code_des&&![CDATA[系统繁忙,请稍后再试.]]&&/err_code_des&
&mch_billno&&![CDATA[6542]]&&/mch_billno&
&mch_id&&/mch_id&
&wxappid&&![CDATA[wx6fa7e3bab7e15415]]&&/wxappid&
&total_amount&3&/total_amount&
* 摇一摇红包预下单
* @author jiosen
class Yhb_pub extends Wxpay_client_pub
var $//code码,用以获取openid
var $//用户的openid
function __construct()
//设置接口链接
$this-&url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/hbpreorder";
//设置curl超时时间
$this-&curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
* 生成接口参数xml
function createXml()
//检测必填参数
if($this-&parameters["mch_billno"] == null)
throw new SDKRuntimeException("缺少发红包接口必填参数mch_billno!"."&br&");
}elseif ($this-&parameters["send_name"] == null ) {
throw new SDKRuntimeException("缺少发红包接口必填参数send_name!"."&br&");
}elseif ($this-&parameters["total_amount"] == null) {
throw new SDKRuntimeException("缺少发红包接口必填参数total_amount!"."&br&");
}elseif ($this-&parameters["total_num"] == null) {
throw new SDKRuntimeException("缺少发红包接口必填参数total_num!"."&br&");
}elseif ($this-&parameters["wishing"] == null) {
throw new SDKRuntimeException("缺少发红包接口必填参数wishing!"."&br&");
}elseif ($this-&parameters["act_name"] == null) {
throw new SDKRuntimeException("缺少发红包接口必填参数act_name!"."&br&");
}elseif ($this-&parameters["remark"] == null) {
throw new SDKRuntimeException("缺少发红包接口必填参数remark!"."&br&");
$this-&parameters["wxappid"] = WxPayConf_pub::APPID;//公众账号ID
$this-&parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
$this-&parameters["nonce_str"] = $this-&createNoncestr();//随机字符串
//$this-&parameters["re_openid"] = $this-&//用户openid
$this-&parameters["hb_type"] = 'NORMAL';//红包类型 NORMAL-普通红包;GROUP-裂变红包(可分享红包给好友,无关注公众号能力)。
$this-&parameters["auth_mchid"] = '';//摇周边商户号
$this-&parameters["auth_appid"] = 'wxbf42bd79c4391863';//摇周边 appid
$this-&parameters["risk_cntl"] = 'NORMAL';//风控设置
$this-&parameters["sign"] = $this-&getSign($this-&parameters);//签名
$this-&arrayToXml($this-&parameters);
}catch (SDKRuntimeException $e)
die($e-&errorMessage());
function hbpreorder()
$this-&postXmlSSL();
$this-&result = $this-&xmlToArray($this-&response);
return $this-&
作用:生成可以获得code的url
function createOauthUrlForCode($redirectUrl)
$urlObj["appid"] = WxPayConf_pub::APPID;
$urlObj["redirect_uri"] = "$redirectUrl";
$urlObj["response_type"] = "code";
$urlObj["scope"] = "snsapi_base";
$urlObj["state"] = "STATE"."#wechat_redirect";
$bizString = $this-&formatBizQueryParaMap($urlObj, false);
return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizS
作用:生成可以获得openid的url
function createOauthUrlForOpenid()
$urlObj["appid"] = WxPayConf_pub::APPID;
$urlObj["secret"] = WxPayConf_pub::APPSECRET;
$urlObj["code"] = $this-&
$urlObj["grant_type"] = "authorization_code";
$bizString = $this-&formatBizQueryParaMap($urlObj, false);
return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizS
作用:通过curl向微信提交code,以获取openid
function getOpenid()
$url = $this-&createOauthUrlForOpenid();
//初始化curl
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOP_TIMEOUT, $this-&curl_timeout);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//运行curl,结果以jason形式返回
$res = curl_exec($ch);
curl_close($ch);
//取出openid
$data = json_decode($res,true);
$this-&openid = $data['openid'];
return $this-&
作用:设置code
function setCode($code_)
$this-&code = $code_;
&这里需要注意的是& auth_mchid 和 auth_appid 要填摇周边平台给出的appid 和商户号
调用 (这里不贴前端页面了)
$Redpack = new \Yhb_pub();
$Redpack-&setParameter('mch_billno', WxPayConf_pub::MCHID.date('YmdHis').rand());
//商户名称
$Redpack-&setParameter('send_name', "商户名称");
//付款金额
$Redpack-&setParameter('total_amount', 100); //单位分
//红包发放总人数
$Redpack-&setParameter('amt_type', "ALL_RAND");
$Redpack-&setParameter('total_num', 1);
//红包祝福语
$Redpack-&setParameter('wishing', "摇一摇送红包");
//活动名称
$Redpack-&setParameter('act_name', "摇一摇送红包");
$Redpack-&setParameter('remark', "摇一摇送红包 备注");
$result = $Redpack-&hbpreorder();
if($result[''])
3.录入红包
在调用"创建红包活动"接口之后,调用此接口录入红包信息。注意,此接口每次调用,都会向某个活动新增一批红包信息,如果红包数少于100 个,请通过一次调用添加所有红包信息。如果红包数大于100,可以多次调用接口添加。请注意确保多次录入的红包ticket总的数目不大于创建该红包活动 时设置的total值。
接口调用说明
服务器端调用
http请求方式: POST
URL:https://api.weixin.qq.com/shakearound/lottery/setprizebucket?access_token=ACCESSTOKEN
请求参数说明
参数类型说明
access_token
accesstoken,以参数的形式拼装在url后
POST BODY:JSON格式的结构体
参数类型说明
lottery_id
红包抽奖id,来自addlotteryinfo返回的lottery_id
红包提供者的商户号,,需与预下单中的商户号mch_id一致
sponsor_appid
红包提供商户公众号的appid,需与预下单中的公众账号appid(wxappid)一致
prize_info_list
红包ticket列表,如果红包数较多,可以一次传入多个红包,批量调用该接口设置红包信息。每次请求传入的红包个数上限为100
预下单时返回的红包ticket,单个活动红包ticket数量上限为100000个,可添加多次。
Content-Type: application/json Post Body:
"lottery_id": "xxxxxxllllll",
"mchid": "",
"sponsor_appid": "wx8888",
"prize_info_list": [
"ticket": "v1|ZiPs2l0hpMBp3uwGI1rwp45vOdz/V/zQ/00jP9MeWT+e47/q1FJjwCIP34frSjzOxAEzJ7k2CtAg1pmcShvkChBWqbThxPm6MBuzceoHtj79iHuHaEn0WAO+j4sXnXnbGswFOlDYWg1ngvrRYnCY3g=="
"ticket": "v1|fOhNUTap1oepSm5ap0hx1gmATM\/QX\/xn3sZWL7K+5Z10sbV5\/mZ4SwxwxbK2SPV32eLRvjd4ww1G3H5a+ypqRrySi+4oo97y63KoEQbRCPjbkyQBY8AYVyvD40V2b9slTQCm2igGY98mPe+VxZiayQ=="
返回数据说明
参数类型说明
错误码。0为成功,其他为失败。详细请参考错误码表
repeat_ticket_list
重复使用的ticket列表,如为空,将不返回
expire_ticket_list
过期的ticket列表,如为空,将不返回
invalid_amount_ticket_list
金额不在大于1元,小于1000元的ticket列表,如为空,将不返回
success_num
成功录入的红包数量
wrong_authmchid_ticket_list
原因:生成红包的时候,授权商户号auth_mchid和auth_appid没有写摇周边的商户号
invalid_ticket_list
ticket解析失败,可能有错别字符或不完整
"errcode":0,
"errmsg":"",
"repeat_ticket_list":[
"ticket": "v1|ZiPs2l0hpMBp3uwGI1rwp45vOdz/V/zQ/00jP9MeWT+e47/q1FJjwCIP34frSjzOxAEzJ7k2CtAg1pmcShvkChBWqbThxPm6MBuzceoHtj79iHuHaEn0WAO+j4sXnXnbGswFOlDYWg1ngvrRYnCY3g=="
"ticket":"v1|ZiPs2l0zzXCsdfwe45dxCdHiukOdz/V/zQ/89xcnC5XnT+e47/q1FJjwCO4frSjzOxAEzJ7k2CtAg1pmcShvkChBWzc45dDGC32Dcxx4DGxczjDCGsdjowe9iHuaEn0WAO+GswFOlDYWg1ngvrRYnCY3g=="
"success_num":100
* 摇一摇红包 录入红包
* @author jiosen
class lottery_pub extends Wxpay_client_pub
var $//code码,用以获取openid
var $//用户的openid
function __construct($access_token)
//设置接口链接
$this-&url = "https://api.weixin.qq.com/shakearound/lottery/setprizebucket?access_token=".$access_
//设置curl超时时间
$this-&curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
* 生成接口参数
function createJson()
//检测必填参数
if($this-&parameters["lottery_id"] == null)
throw new SDKRuntimeException("缺少抽奖活动id lottery_id !"."&br&");
}else if(empty($this-&parameters["prize_info_list"])){
throw new SDKRuntimeException("缺少抽奖活动红包 prize_info_list !"."&br&");
$this-&parameters["mchid"] = WxPayConf_pub::MCHID;//授权商户号
$this-&parameters["sponsor_appid"] = WxPayConf_pub::APPID;//授权上号appid
json_encode($this-&parameters);
//echo json_encode($this-&parameters);
}catch (SDKRuntimeException $e)
die($e-&errorMessage());
function setJsonArray($parameter, $parameterValue){
$this-&parameters[$this-&trimString($parameter)] = $parameterV
function hbpreorder()
$data = $this-&createJson();
$result = $this-&curl_post($this-&url,$data);
$result = json_decode($result);
function curl_post($url,$data)
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_POST, 1);//发送一个常规的Post请求
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);//Post提交的数据包
$rv = curl_exec($curl);//输出内容
curl_close($curl);
作用:生成可以获得code的url
function createOauthUrlForCode($redirectUrl)
$urlObj["appid"] = WxPayConf_pub::APPID;
$urlObj["redirect_uri"] = "$redirectUrl";
$urlObj["response_type"] = "code";
$urlObj["scope"] = "snsapi_base";
$urlObj["state"] = "STATE"."#wechat_redirect";
$bizString = $this-&formatBizQueryParaMap($urlObj, false);
return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizS
作用:生成可以获得openid的url
function createOauthUrlForOpenid()
$urlObj["appid"] = WxPayConf_pub::APPID;
$urlObj["secret"] = WxPayConf_pub::APPSECRET;
$urlObj["code"] = $this-&
$urlObj["grant_type"] = "authorization_code";
$bizString = $this-&formatBizQueryParaMap($urlObj, false);
return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizS
作用:通过curl向微信提交code,以获取openid
function getOpenid()
$url = $this-&createOauthUrlForOpenid();
//初始化curl
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOP_TIMEOUT, $this-&curl_timeout);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//运行curl,结果以jason形式返回
$res = curl_exec($ch);
curl_close($ch);
//取出openid
$data = json_decode($res,true);
$this-&openid = $data['openid'];
return $this-&
作用:设置code
function setCode($code_)
$this-&code = $code_;
         $token = getAccessToken();    $Redpack = new \lottery_pub($token);    $lottery_id = ''; //这里读取数据库取出创建活动时返回的 lottery_id
$Redpack-&setParameter('lottery_id', $lottery_id);
$prize_info_list =array(array('ticket'=&'这里取出预下单返回的sp_ticket'));
$Redpack-&setJsonArray('prize_info_list', $prize_info_list);
$Redpack-&hbpreorder();
抢红包页面& php
function getshakeinfo($access_token,$ticket){
$getshakeinfourl='https://api.weixin.qq.com/shakearound/user/getshakeinfo?access_token='.$access_
if($access_token){
$data=array('ticket' =&$ticket);
$rd=$this-&curl_post($getshakeinfourl,json_encode($data));
$jo=json_decode($rd);
echo 'access_token null';
     $ticket=$_GET['ticket'];//获叏设备信息,包括 U UID 、 major 、 minor ,以及距离、 openID 等信息
     $token = getAccessToken();
$shake=getshakeinfo($token,$ticket);
$openid=$shake-&data-&
$jsapi = new Common_util_pub();
$noncestr = $jsapi-&createNoncestr();
$parameters = array(
'lottery_id' =&'创建活动时候返回的活动ID',
'noncestr'=&$noncestr,
'openid'=&$openid,
$signStr = $jsapi-&formatBizQueryParaMap($parameters,false);
$key = '创建活动时候的key';
$signStr=$signStr."&key=".$
$sign = strtoupper(md5($signStr));
&上一步返回的参数填在抢红包html页面
&script type="text/javascript" src="http://zb.weixin.qq.com/app/shakehb/BeaconShakehbJsBridge.js"&
&script type="text/javascript"&
BeaconShakehbJsBridge.ready(function(){
//alert();
BeaconShakehbJsBridge.invoke('jumpHongbao',{lottery_id:"{$lottery_id}",noncestr:"{$noncestr}",openid:"{$openid}",sign:"{$sign}"});
     
用户进入红包页面时,后台会将一个红包ticket和用户openid绑定,微信会把这个事件推送到开发者填写的URL(登录公众平台进入开发者中心设置)。推送内容包含用户openid,红包活动id,红包ticket、金额以及红包绑定时间。
注:红包绑定用户不等同于用户领取红包。用户进入红包页面后,有可能不拆红包,但该红包ticket已被绑定,不能再被其他用户绑定,过期后会退回商户财付通账户。
推送XML数据包示例
&ToUserName&&![CDATA[toUser]]&&/ToUserName&
&FromUserName&&![CDATA[fromUser]]&&/FromUserName&
&CreateTime&&/CreateTime&
&MsgType&&![CDATA[event]]&&/MsgType&
&Event&&![CDATA[ShakearoundLotteryBind]]&&/Event&
&LotteryId&&![CDATA[lotteryid]]&&/LotteryId&
&Ticket&&![CDATA[ticket]]&&/Ticket&
&Money&88&/Money&
&BindTime&&/BindTime&
添加事件处理即可
* 事件处理
* @param unknown $object
* @return string
public function handleEvent($object) {
// Event是事件类型(subscribe,LOCATION)
$oneEvent = $object-&E
// EventKey是菜单事件的key值
$key = $object-&EventK
// 关注事件
if ($oneEvent == "subscribe" || $oneEvent == "SCAN") {
if(!empty($object-&Ticket)) {
//扫码事件
//关注事件
}else if($oneEvent=="ShakearoundLotteryBind"){
//添加到数据库
}else if.......其他的事件......
&完毕了.时间比较匆忙 也没时间做优化 大神经过顺便指导12& 我好搓的英文基础
下面贴上完整WxPayPubHelper 集成了所有支付类 配置可用
* 微信支付帮助库
* ====================================================
* 接口分三种类型:
* 【请求型接口】--Wxpay_client_
统一支付接口类--UnifiedOrder
订单查询接口--OrderQuery
退款申请接口--Refund
退款查询接口--RefundQuery
对账单接口--DownloadBill
短链接转换接口--ShortUrl
* 【响应型接口】--Wxpay_server_
通用通知接口--Notify
Native支付&&请求商家获取商品信息接口--NativeCall
* 【其他】
静态链接二维码--NativeLink
JSAPI支付--JsApi
* =====================================================
* 【CommonUtil】常用工具:
trimString(),设置参数时需要用到的字符处理函数
createNoncestr(),产生随机字符串,不长于32位
formatBizQueryParaMap(),格式化参数,签名过程需要用到
getSign(),生成签名
arrayToXml(),array转xml
xmlToArray(),xml转 array
postXmlCurl(),以post方式提交xml到对应的接口url
postXmlSSLCurl(),使用证书,以post方式提交xml到对应的接口url
include_once("SDKRuntimeException.php");
include_once("WxPay.pub.config.php");
* 所有接口的基类
class Common_util_pub
function __construct() {
function trimString($value)
if (null != $value)
if (strlen($ret) == 0)
作用:产生随机字符串,不长于32位
public function createNoncestr( $length = 32 )
$chars = "abcdefghijklmnopqrstuvwxyz";
for ( $i = 0; $i & $ $i++ )
$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
作用:格式化参数,签名过程需要使用
function formatBizQueryParaMap($paraMap, $urlencode)
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k =& $v)
if($urlencode)
$v = urlencode($v);
//$buff .= strtolower($k) . "=" . $v . "&";
$buff .= $k . "=" . $v . "&";
if (strlen($buff) & 0)
$reqPar = substr($buff, 0, strlen($buff)-1);
return $reqP
作用:生成签名
public function getSign($Obj)
foreach ($Obj as $k =& $v)
$Parameters[$k] = $v;
//签名步骤一:按字典序排序参数
ksort($Parameters);
$String = $this-&formatBizQueryParaMap($Parameters, false);
//echo '【string1】'.$String.'&/br&';
//签名步骤二:在string后加入KEY
$String = $String."&key=".WxPayConf_pub::KEY;
//echo "【string2】".$String."&/br&";
//签名步骤三:MD5加密
$String = md5($String);
//echo "【string3】 ".$String."&/br&";
//签名步骤四:所有字符转为大写
$result_ = strtoupper($String);
//echo "【result】 ".$result_."&/br&";
return $result_;
作用:array转xml
function arrayToXml($arr)
$xml = "&xml&";
foreach ($arr as $key=&$val)
if (is_numeric($val))
$xml.="&".$key."&".$val."&/".$key."&";
$xml.="&".$key."&&![CDATA[".$val."]]&&/".$key."&";
$xml.="&/xml&";
作用:将xml转为array
public function xmlToArray($xml)
//将XML转为array
$array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $array_
作用:以post方式提交xml到对应的接口url
public function postXmlCurl($xml,$url,$second=30)
//初始化curl
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOP_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);
//post提交方式
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
//运行curl
$data = curl_exec($ch);
curl_close($ch);
//返回结果
curl_close($ch);
$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);
作用:使用证书,以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);
//设置证书
//使用证书:cert 与 key 分别属于两个.pem文件
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT,WxPayConf_pub::SSLCERT_PATH );
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY, WxPayConf_pub::SSLKEY_PATH);
curl_setopt($ch, CURLOPT_SSLCERT,WxPayConf_pub::SSLCERT_PATH);
curl_setopt($ch, CURLOPT_SSLKEY,WxPayConf_pub::SSLKEY_PATH);
curl_setopt($ch, CURLOPT_CAINFO, WxPayConf_pub::SSLCA_PATH); // CA根证书(用来验证的网站证书是否是CA颁布)
//post提交方式
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
$data = curl_exec($ch);
//返回结果
if($data){
curl_close($ch);
$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);
作用:打印数组
function printErr($wording='',$err='')
print_r('&pre&');
echo $wording."&/br&";
var_dump($err);
print_r('&/pre&');
* 请求型接口的基类
class Wxpay_client_pub extends Common_util_pub
var $//请求参数,类型为关联数组
public $//微信返回的响应
public $//返回参数,类型为关联数组
var $//接口链接
var $curl_//curl超时时间
作用:设置请求参数
function setParameter($parameter, $parameterValue)
$this-&parameters[$this-&trimString($parameter)] = $this-&trimString($parameterValue);
作用:设置标配的请求参数,生成签名,生成接口参数xml
function createXml()
$this-&parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
$this-&parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
$this-&parameters["nonce_str"] = $this-&createNoncestr();//随机字符串
$this-&parameters["sign"] = $this-&getSign($this-&parameters);//签名
$this-&arrayToXml($this-&parameters);
作用:post请求xml
function postXml()
$xml = $this-&createXml();
$this-&response = $this-&postXmlCurl($xml,$this-&url,$this-&curl_timeout);
return $this-&
作用:使用证书post请求xml
function postXmlSSL()
$xml = $this-&createXml();
$this-&response = $this-&postXmlSSLCurl($xml,$this-&url,$this-&curl_timeout);
return $this-&
作用:获取结果,默认不使用证书
function getResult()
$this-&postXml();
$this-&result = $this-&xmlToArray($this-&response);
return $this-&
* 统一支付接口类
class UnifiedOrder_pub extends Wxpay_client_pub
function __construct()
//设置接口链接
$this-&url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
//设置curl超时时间
$this-&curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
* 生成接口参数xml
function createXml()
//检测必填参数
if($this-&parameters["out_trade_no"] == null)
throw new SDKRuntimeException("缺少统一支付接口必填参数out_trade_no!"."&br&");
}elseif($this-&parameters["body"] == null){
throw new SDKRuntimeException("缺少统一支付接口必填参数body!"."&br&");
}elseif ($this-&parameters["total_fee"] == null ) {
throw new SDKRuntimeException("缺少统一支付接口必填参数total_fee!"."&br&");
}elseif ($this-&parameters["notify_url"] == null) {
throw new SDKRuntimeException("缺少统一支付接口必填参数notify_url!"."&br&");
}elseif ($this-&parameters["trade_type"] == null) {
throw new SDKRuntimeException("缺少统一支付接口必填参数trade_type!"."&br&");
}elseif ($this-&parameters["trade_type"] == "JSAPI" &&
$this-&parameters["openid"] == NULL){
throw new SDKRuntimeException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!"."&br&");
$this-&parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
$this-&parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
$this-&parameters["spbill_create_ip"] = $_SERVER['REMOTE_ADDR'];//终端ip
$this-&parameters["nonce_str"] = $this-&createNoncestr();//随机字符串
$this-&parameters["sign"] = $this-&getSign($this-&parameters);//签名
$this-&arrayToXml($this-&parameters);
}catch (SDKRuntimeException $e)
die($e-&errorMessage());
* 获取prepay_id
function getPrepayId()
$this-&postXml();
$this-&result = $this-&xmlToArray($this-&response);
$prepay_id = $this-&result["prepay_id"];
return $prepay_
* 订单查询接口
class OrderQuery_pub extends Wxpay_client_pub
function __construct()
//设置接口链接
$this-&url = "https://api.mch.weixin.qq.com/pay/orderquery";
//设置curl超时时间
$this-&curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
* 生成接口参数xml
function createXml()
//检测必填参数
if($this-&parameters["out_trade_no"] == null &&
$this-&parameters["transaction_id"] == null)
throw new SDKRuntimeException("订单查询接口中,out_trade_no、transaction_id至少填一个!"."&br&");
$this-&parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
$this-&parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
$this-&parameters["nonce_str"] = $this-&createNoncestr();//随机字符串
$this-&parameters["sign"] = $this-&getSign($this-&parameters);//签名
$this-&arrayToXml($this-&parameters);
}catch (SDKRuntimeException $e)
die($e-&errorMessage());
* 退款申请接口
class Refund_pub extends Wxpay_client_pub
function __construct() {
//设置接口链接
$this-&url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
//设置curl超时时间
$this-&curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
* 生成接口参数xml
function createXml()
//检测必填参数
if($this-&parameters["out_trade_no"] == null && $this-&parameters["transaction_id"] == null) {
throw new SDKRuntimeException("退款申请接口中,out_trade_no、transaction_id至少填一个!"."&br&");
}elseif($this-&parameters["out_refund_no"] == null){
throw new SDKRuntimeException("退款申请接口中,缺少必填参数out_refund_no!"."&br&");
}elseif($this-&parameters["total_fee"] == null){
throw new SDKRuntimeException("退款申请接口中,缺少必填参数total_fee!"."&br&");
}elseif($this-&parameters["refund_fee"] == null){
throw new SDKRuntimeException("退款申请接口中,缺少必填参数refund_fee!"."&br&");
}elseif($this-&parameters["op_user_id"] == null){
throw new SDKRuntimeException("退款申请接口中,缺少必填参数op_user_id!"."&br&");
$this-&parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
$this-&parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
$this-&parameters["nonce_str"] = $this-&createNoncestr();//随机字符串
$this-&parameters["sign"] = $this-&getSign($this-&parameters);//签名
$this-&arrayToXml($this-&parameters);
}catch (SDKRuntimeException $e)
die($e-&errorMessage());
作用:获取结果,使用证书通信
function getResult()
$this-&postXmlSSL();
$this-&result = $this-&xmlToArray($this-&response);
return $this-&
* 退款查询接口
class RefundQuery_pub extends Wxpay_client_pub
function __construct() {
//设置接口链接
$this-&url = "https://api.mch.weixin.qq.com/pay/refundquery";
//设置curl超时时间
$this-&curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
* 生成接口参数xml
function createXml()
if($this-&parameters["out_refund_no"] == null &&
$this-&parameters["out_trade_no"] == null &&
$this-&parameters["transaction_id"] == null &&
$this-&parameters["refund_id "] == null)
throw new SDKRuntimeException("退款查询接口中,out_refund_no、out_trade_no、transaction_id、refund_id四个参数必填一个!"."&br&");
$this-&parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
$this-&parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
$this-&parameters["nonce_str"] = $this-&createNoncestr();//随机字符串
$this-&parameters["sign"] = $this-&getSign($this-&parameters);//签名
$this-&arrayToXml($this-&parameters);
}catch (SDKRuntimeException $e)
die($e-&errorMessage());
作用:获取结果,使用证书通信
function getResult()
$this-&postXmlSSL();
$this-&result = $this-&xmlToArray($this-&response);
return $this-&
* 对账单接口
class DownloadBill_pub extends Wxpay_client_pub
function __construct()
//设置接口链接
$this-&url = "https://api.mch.weixin.qq.com/pay/downloadbill";
//设置curl超时时间
$this-&curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
* 生成接口参数xml
function createXml()
if($this-&parameters["bill_date"] == null )
throw new SDKRuntimeException("对账单接口中,缺少必填参数bill_date!"."&br&");
$this-&parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
$this-&parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
$this-&parameters["nonce_str"] = $this-&createNoncestr();//随机字符串
$this-&parameters["sign"] = $this-&getSign($this-&parameters);//签名
$this-&arrayToXml($this-&parameters);
}catch (SDKRuntimeException $e)
die($e-&errorMessage());
作用:获取结果,默认不使用证书
function getResult()
$this-&postXml();
$this-&result = $this-&xmlToArray($this-&result_xml);
return $this-&
* 短链接转换接口
class ShortUrl_pub extends Wxpay_client_pub
function __construct()
//设置接口链接
$this-&url = "https://api.mch.weixin.qq.com/tools/shorturl";
//设置curl超时时间
$this-&curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
* 生成接口参数xml
function createXml()
if($this-&parameters["long_url"] == null )
throw new SDKRuntimeException("短链接转换接口中,缺少必填参数long_url!"."&br&");
$this-&parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
$this-&parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
$this-&parameters["nonce_str"] = $this-&createNoncestr();//随机字符串
$this-&parameters["sign"] = $this-&getSign($this-&parameters);//签名
$this-&arrayToXml($this-&parameters);
}catch (SDKRuntimeException $e)
die($e-&errorMessage());
* 获取prepay_id
function getShortUrl()
$this-&postXml();
$prepay_id = $this-&result["short_url"];
return $prepay_
* 响应型接口基类
class Wxpay_server_pub extends Common_util_pub
public $//接收到的数据,类型为关联数组
var $returnP//返回参数,类型为关联数组
* 将微信的请求xml转换成关联数组,以方便数据处理
function saveData($xml)
$this-&data = $this-&xmlToArray($xml);
function checkSign()
$tmpData = $this-&
unset($tmpData['sign']);
$sign = $this-&getSign($tmpData);//本地签名
if ($this-&data['sign'] == $sign) {
return TRUE;
return FALSE;
* 获取微信的请求数据
function getData()
return $this-&
* 设置返回微信的xml数据
function setReturnParameter($parameter, $parameterValue)
$this-&returnParameters[$this-&trimString($parameter)] = $this-&trimString($parameterValue);
* 生成接口参数xml
function createXml()
return $this-&arrayToXml($this-&returnParameters);
* 将xml数据返回微信
function returnXml()
$returnXml = $this-&createXml();
return $returnX
* 通用通知接口
class Notify_pub extends Wxpay_server_pub
* 请求商家获取商品信息接口
class NativeCall_pub extends Wxpay_server_pub
* 生成接口参数xml
function createXml()
if($this-&returnParameters["return_code"] == "SUCCESS"){
$this-&returnParameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
$this-&returnParameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
$this-&returnParameters["nonce_str"] = $this-&createNoncestr();//随机字符串
$this-&returnParameters["sign"] = $this-&getSign($this-&returnParameters);//签名
return $this-&arrayToXml($this-&returnParameters);
* 获取product_id
function getProductId()
$product_id = $this-&data["product_id"];
return $product_
* 静态链接二维码
class NativeLink_pub
extends Common_util_pub
var $//静态链接参数
var $//静态链接
function __construct()
* 设置参数
function setParameter($parameter, $parameterValue)
$this-&parameters[$this-&trimString($parameter)] = $this-&trimString($parameterValue);
* 生成Native支付链接二维码
function createLink()
if($this-&parameters["product_id"] == null)
throw new SDKRuntimeException("缺少Native支付二维码链接必填参数product_id!"."&br&");
$this-&parameters["appid"] = WxPayConf_pub::APPID;//公众账号ID
$this-&parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
$time_stamp = time();
$this-&parameters["time_stamp"] = "$time_stamp";//时间戳
$this-&parameters["nonce_str"] = $this-&createNoncestr();//随机字符串
$this-&parameters["sign"] = $this-&getSign($this-&parameters);//签名
$bizString = $this-&formatBizQueryParaMap($this-&parameters, false);
$this-&url = "weixin://wxpay/bizpayurl?".$bizS
}catch (SDKRuntimeException $e)
die($e-&errorMessage());
* 返回链接
function getUrl()
$this-&createLink();
return $this-&
* JSAPI支付&&H5网页端调起支付接口
class JsApi_pub extends Common_util_pub
var $//code码,用以获取openid
var $//用户的openid
var $//jsapi参数,格式为json
var $prepay_//使用统一支付接口得到的预支付id
var $curl_//curl超时时间
function __construct()
//设置curl超时时间
$this-&curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
作用:生成可以获得code的url
function createOauthUrlForCode($redirectUrl)
$urlObj["appid"] = WxPayConf_pub::APPID;
$urlObj["redirect_uri"] = "$redirectUrl";
$urlObj["response_type"] = "code";
$urlObj["scope"] = "snsapi_base";
$urlObj["state"] = "STATE"."#wechat_redirect";
$bizString = $this-&formatBizQueryParaMap($urlObj, false);
return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizS
作用:生成可以获得openid的url
function createOauthUrlForOpenid()
$urlObj["appid"] = WxPayConf_pub::APPID;
$urlObj["secret"] = WxPayConf_pub::APPSECRET;
$urlObj["code"] = $this-&
$urlObj["grant_type"] = "authorization_code";
$bizString = $this-&formatBizQueryParaMap($urlObj, false);
return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizS
作用:通过curl向微信提交code,以获取openid
function getOpenid()
$url = $this-&createOauthUrlForOpenid();
//初始化curl
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOP_TIMEOUT, $this-&curl_timeout);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//运行curl,结果以jason形式返回
$res = curl_exec($ch);
curl_close($ch);
//取出openid
$data = json_decode($res,true);
$this-&openid = $data['openid'];
return $this-&
作用:设置prepay_id
function setPrepayId($prepayId)
$this-&prepay_id = $prepayId;
作用:设置code
function setCode($code_)
$this-&code = $code_;
作用:设置jsapi的参数
public function getParameters()
$jsApiObj["appId"] = WxPayConf_pub::APPID;
$timeStamp = time();
$jsApiObj["timeStamp"] = "$timeStamp";
$jsApiObj["nonceStr"] = $this-&createNoncestr();
$jsApiObj["package"] = "prepay_id=$this-&prepay_id";
$jsApiObj["signType"] = "MD5";
$jsApiObj["paySign"] = $this-&getSign($jsApiObj);
$this-&parameters = json_encode($jsApiObj);
return $this-&
* 现金红包接口
* @author gaoyl101
class Redpack_pub extends Wxpay_client_pub
var $//code码,用以获取openid
var $//用户的openid
function __construct()
//设置接口链接
$this-&url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
//设置curl超时时间
$this-&curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
* 生成接口参数xml
function createXml()
//检测必填参数
if($this-&parameters["mch_billno"] == null)
throw new SDKRuntimeException("缺少发红包接口必填参数mch_billno!"."&br&");
}elseif($this-&parameters["nick_name"] == null){
throw new SDKRuntimeException("缺少发红包接口必填参数nick_name!"."&br&");
}elseif ($this-&parameters["send_name"] == null ) {
throw new SDKRuntimeException("缺少发红包接口必填参数send_name!"."&br&");
}elseif ($this-&parameters["total_amount"] == null) {
throw new SDKRuntimeException("缺少发红包接口必填参数total_amount!"."&br&");
}elseif($this-&parameters["min_value"] == null){
throw new SDKRuntimeException("缺少发红包接口必填参数min_value!"."&br&");
}elseif ($this-&parameters["max_value"] == null ) {
throw new SDKRuntimeException("缺少发红包接口必填参数max_value!"."&br&");
}elseif ($this-&parameters["total_num"] == null) {
throw new SDKRuntimeException("缺少发红包接口必填参数total_num!"."&br&");
}elseif ($this-&parameters["wishing"] == null) {
throw new SDKRuntimeException("缺少发红包接口必填参数wishing!"."&br&");
}elseif ($this-&parameters["act_name"] == null) {
throw new SDKRuntimeException("缺少发红包接口必填参数act_name!"."&br&");
}elseif ($this-&parameters["remark"] == null) {
throw new SDKRuntimeException("缺少发红包接口必填参数remark!"."&br&");
$this-&parameters["wxappid"] = WxPayConf_pub::APPID;//公众账号ID
$this-&parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
$this-&parameters["client_ip"] = $_SERVER['REMOTE_ADDR'];//终端ip
$this-&parameters["nonce_str"] = $this-&createNoncestr();//随机字符串
$this-&parameters["re_openid"] = $this-&parameters["re_openid"];
//$this-&//用户openid
$this-&parameters["sign"] = $this-&getSign($this-&parameters);//签名
$this-&arrayToXml($this-&parameters);
}catch (SDKRuntimeException $e)
die($e-&errorMessage());
function sendRedpack()
$this-&postXmlSSL();
$this-&result = $this-&xmlToArray($this-&response);
return $this-&
作用:生成可以获得code的url
function createOauthUrlForCode($redirectUrl)
$urlObj["appid"] = WxPayConf_pub::APPID;
$urlObj["redirect_uri"] = "$redirectUrl";
$urlObj["response_type"] = "code";
$urlObj["scope"] = "snsapi_base";
$urlObj["state"] = "STATE"."#wechat_redirect";
$bizString = $this-&formatBizQueryParaMap($urlObj, false);
return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizS
作用:生成可以获得openid的url
function createOauthUrlForOpenid()
$urlObj["appid"] = WxPayConf_pub::APPID;
$urlObj["secret"] = WxPayConf_pub::APPSECRET;
$urlObj["code"] = $this-&
$urlObj["grant_type"] = "authorization_code";
$bizString = $this-&formatBizQueryParaMap($urlObj, false);
return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizS
作用:通过curl向微信提交code,以获取openid
function getOpenid()
$url = $this-&createOauthUrlForOpenid();
//初始化curl
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOP_TIMEOUT, $this-&curl_timeout);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//运行curl,结果以jason形式返回
$res = curl_exec($ch);
curl_close($ch);
//取出openid
$data = json_decode($res,true);
$this-&openid = $data['openid'];
return $this-&
作用:设置code
function setCode($code_)
$this-&code = $code_;
* 红包支付接口
* @author gaoyl101
class Groupredpack_pub extends Wxpay_client_pub
var $//code码,用以获取openid
var $//用户的openid
function __construct()
//设置接口链接
$this-&url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack";
//设置curl超时时间
$this-&curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
* 生成接口参数xml
function createXml()
//检测必填参数
if($this-&parameters["mch_billno"] == null)
throw new SDKRuntimeException("缺少发红包接口必填参数mch_billno!"."&br&");
}elseif ($this-&parameters["send_name"] == null ) {
throw new SDKRuntimeException("缺少发红包接口必填参数send_name!"."&br&");
}elseif ($this-&parameters["total_amount"] == null) {
throw new SDKRuntimeException("缺少发红包接口必填参数total_amount!"."&br&");
}elseif ($this-&parameters["total_num"] == null) {
throw new SDKRuntimeException("缺少发红包接口必填参数total_num!"."&br&");
}elseif ($this-&parameters["amt_type"] == null) {
throw new SDKRuntimeException("缺少发红包接口必填参数amt_type!"."&br&");
}elseif ($this-&parameters["wishing"] == null) {
throw new SDKRuntimeException("缺少发红包接口必填参数wishing!"."&br&");
}elseif ($this-&parameters["act_name"] == null) {
throw new SDKRuntimeException("缺少发红包接口必填参数act_name!"."&br&");
}elseif ($this-&parameters["remark"] == null) {
throw new SDKRuntimeException("缺少发红包接口必填参数remark!"."&br&");
$this-&parameters["wxappid"] = WxPayConf_pub::APPID;//公众账号ID
$this-&parameters["mch_id"] = WxPayConf_pub::MCHID;//商户号
$this-&parameters["nonce_str"] = $this-&createNoncestr();//随机字符串
$this-&parameters["re_openid"] = $this-&//用户openid
$this-&parameters["sign"] = $this-&getSign($this-&parameters);//签名
$this-&arrayToXml($this-&parameters);
}catch (SDKRuntimeException $e)
die($e-&errorMessage());
function sendRedpack()
$this-&postXmlSSL();
$this-&result = $this-&xmlToArray($this-&response);
return $this-&
作用:生成可以获得code的url
function createOauthUrlForCode($redirectUrl)
$urlObj["appid"] = WxPayConf_pub::APPID;
$urlObj["redirect_uri"] = "$redirectUrl";
$urlObj["response_type"] = "code";
$urlObj["scope"] = "snsapi_base";
$urlObj["state"] = "STATE"."#wechat_redirect";
$bizString = $this-&formatBizQueryParaMap($urlObj, false);
return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizS
作用:生成可以获得openid的url
function createOauthUrlForOpenid()
$urlObj["appid"] = WxPayConf_pub::APPID;
$urlObj["secret"] = WxPayConf_pub::APPSECRET;
$urlObj["code"] = $this-&
$urlObj["grant_type"] = "authorization_code";
$bizString = $this-&formatBizQueryParaMap($urlObj, false);
return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizS
作用:通过curl向微信提交code,以获取openid
function getOpenid()
$url = $this-&createOauthUrlForOpenid();
//初始化curl
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOP_TIMEOUT, $this-&curl_timeout);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//运行curl,结果以jason形式返回
$res = curl_exec($ch);
curl_close($ch);
//取出openid
$data = json_decode($res,true);
$this-&openid = $data['openid'];
return $this-&
作用:设置code
function setCode($code_)
$this-&code = $code_;
* 摇一摇红包预下单
* @author jiosen
class Yhb_pub extends Wxpay_cli

我要回帖

更多关于 微信公众平台发放红包 的文章

 

随机推荐