WeChatで周辺の赤い封筒をシェイク、周辺の赤い封筒をシェイク
朝、上司がデバイスを投げて、赤い封筒をシェイクしたいと言ったので、強力なDu Niangをオンラインで検索しましたが、見つかりませんでした。マスターによってソースコードが共有されたので、今は執筆に没頭できます
WeChatの公式説明は以下の通りです
赤い封筒を振る手順
機能の説明
周囲の赤い封筒を振るインターフェイスは、オフライン加盟店向けに提供される赤い封筒発行機能です。ユーザーは加盟店などのオフラインの場所で周囲を振ることで加盟店が発行する赤い封筒を受け取ることができます。オンライン転送や共有は無効です。
開発者はインターフェイスを通じてシェイクレッドエンベロープ機能を開発できます:
ユーザー側の対話プロセス




赤い封筒コンポーネントインターフェイス呼び出しプロセス
リーリーインターフェースの説明
リーリー赤い封筒アクティビティを作成し、赤い封筒アクティビティの有効期間、赤い封筒アクティビティのスイッチ、その他の基本情報を設定し、アクティビティIDを返します
リーリーインターフェース呼び出し手順
リーリー リーリー リーリーリクエストパラメータの説明
リーリーパラメータ | タイプ | 説明 |
---|---|---|
アクセストークン | 文字列 | アクセストークン、パラメータの形式で URL の後に組み立てられます |
テンプレートを使用する | int | テンプレートを使用するかどうか、1: 使用する、2: 使用しない、URL の後のパラメーターの形式で組み立てられます。 (テンプレートは、対話型フローチャートの赤い封筒の読み込みページです。テンプレートを使用すると、ユーザーはクリックせずに自動的に赤い封筒を開くことができます。テンプレートを使用しない場合は、独自の HTML5 ページを開発して赤い封筒を呼び出す必要があります。ページ上の jsapi) |
ロゴURL | 文字列 | テンプレートページのlogo_urlを使用します。テンプレートを使用しない場合は追加する必要はありません。シェイクインターフェイスに表示されるメッセージアイコン。画像サイズは120×120です。 |
POST BODY: JSON 形式の構造
リーリーパラメータ | タイプ | 説明 |
---|---|---|
タイトル | 文字列 | 抽選イベントの名前 (テンプレートの使用を選択した場合、シェイク メッセージのメイン タイトルとしても使用されます)。最大 6 文字の漢字と 12 文字の英語を使用できます。 |
説明 | 文字列 | 抽選イベントの説明 (テンプレートの使用を選択した場合、シェイク メッセージのサブタイトルとしても使用されます)。最大長は漢字 7 文字、英語 14 文字です。 |
オノフ | int | 宝くじスイッチ。 0 はオフ、1 はオン、デフォルトは 1 です |
開始時間 | 長い | 宝くじ開始時間、UNIXタイムスタンプ、単位秒 |
有効期限 | 長い | 宝くじ終了時刻、UNIX タイムスタンプ、ユニット秒、赤い封筒アクティビティは最大 91 日間有効です |
スポンサーアプリID | 文字列 | 赤い封筒で提供される販売者の公開アカウントの appid は、予約注文の公開アカウントの appid (wxappid) と一致している必要があります |
合計 | 長い | 赤い封筒の合計数は、赤い封筒チケットの合計枚数以上である必要があります。事前注文。 |
ジャンプURL | 文字列 | 赤い封筒のインターフェイスに従った後、サードパーティのカスタマイズされたページにジャンプできます |
キー | 文字列 | イベント宝くじインターフェイスの署名パラメーターを生成するために使用される開発者定義のキー。長さは 32 ビットです。使用法については、符号生成ルールを参照してください |
リクエスト例
リーリー リーリー リーリー戻りデータの説明
リーリーパラメータ | タイプ | 説明 |
---|---|---|
エラーコード | int | エラーコード。 0 は成功、その他は失敗です。詳細はエラーコード表をご参照ください |
エラーメッセージ | 文字列 | エラーメッセージ |
lottery_id | 文字列 | 生成された赤い封筒イベントID |
page_id | int | 生成されたテンプレートページID |
示例
{ "errcode":0, "errmsg":"", "lottery_id":"xxxxxxllllll", "page_id":1, }
<span><strong><br /><span></span></strong></span>
/** * 摇一摇红包 创建活动 * @author jiosen */ class addlotteryinfo_pub extends Wxpay_client_pub { var $code;//code码,用以获取openid var $openid;//用户的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=".$logo; //设置curl超时时间 $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT; } /** * 生成接口参数 json */ function createJson() { try { //检测必填参数 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); return 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); return $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); return $rv; } /** * 作用:生成可以获得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?".$bizString; } /** * 作用:生成可以获得openid的url */ function createOauthUrlForOpenid() { $urlObj["appid"] = WxPayConf_pub::APPID; $urlObj["secret"] = WxPayConf_pub::APPSECRET; $urlObj["code"] = $this->code; $urlObj["grant_type"] = "authorization_code"; $bizString = $this->formatBizQueryParaMap($urlObj, false); return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString; } /** * 作用:通过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->openid; } /** * 作用:设置code */ function setCode($code_) { $this->code = $code_; } }
要注意提交的数据是json 不是xml
前端页面随便做一下
php 代码
$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); //key $Redpack->setParameter('key', $key); $result = $Redpack->hbpreorder(); $result = (array)$result; if($result['errcode']==0){ $lottery_id = $result['lottery_id']; $page_id = $result['page_id']; //这里记得存一下数据库;
}else{ //echo '创建活动失败:'.$result['errmsg']; //这里是错误提示 }
<span><strong>2.预下单</strong></span>
接口说明
设置单个红包的金额,类型等,生成红包信息。预下单完成后,需要在72小时内调用jsapi完成抽红包的操作。(红包过期失效后,资金会退回到商户财付通帐号。)
接口调用说明
服务器端调用 http请求方式: POST https://api.mch.weixin.qq.com/mmpaymkttransfers/hbpreorder POST数据格式:XML 需要商户证书
请求参数说明
参数 | 字段 | 是否必须 | 示例值 | 类型 | 说明 |
---|---|---|---|---|---|
随机字符串 | nonce_str | 是 | 5K8264ILTKCH16CQ2502SI8Z
NMTM67VS |
String(32) | 随机字符串,不长于32位 |
签名 | sign | 是 | C380BEC2BFD727A4B68451335
19F3AD6 |
String(32) | 生成签名方式查看签名算法 |
商户订单号 | mch_billno | 是 | 10000098201411111234567890 | String(28) | 商户订单号(每个订单号必须唯一)组成: mch_id+yyyymmdd+10位一天内不能重复的数字。接口根据商户订单号支持重入, 如出现超时可再调用。 |
商户号 | mch_id | 是 | 10000098 | String(32) | 红包提供者的商户号(微信支付分配的商户号) |
公众账号appid | wxappid | 是 | wx8888888888888888 | String(32) | 红包提供者公众号的appid,对应头像展示在红包页面 |
商户名称 | send_name | 是 | 天虹百货 | String(32) | 红包提供者名称,展示在红包页面 |
红包类型 | hb_type | 是 | NORMAL | String(16) | NORMAL-普通红包;GROUP-裂变红包(可分享红包给好友,无关注公众号能力)。 |
总金额 | total_amount | 是 | 1000 | int | 总付款金额,单位分 |
红包发放总人数 | total_num | 是 | 1 | int | 红包发放总人数,即总共有多少人可以领到该组红包(包括分享者)。普通红包填1,裂变红包必须大于1。 |
红包金额设置方式 | amt_type | 是 | ALL_RAND | String(32) | 红包金额设置方式,只对裂变红包生效。ALL_RAND—全部随机 |
红包祝福语 | wishing | 是 | 感谢您参加猜灯谜活动,祝您元宵节快乐 | String(16) | 红包祝福语,展示在红包页面 |
活动名称 | act_name | 是 | 猜灯谜抢红包活动 | String(32) | 活动名称,在不支持原生红包的微信版本中展示在红包消息 |
备注 | remark | 是 | 猜越多得越多,快来抢! | String(32) | 备注信息,在不支持原生红包的微信版本中展示在红包消息 |
授权商户号 | auth_mchid | 是 | 1000052601 | String(32) | 用于发红包时微信支付识别摇周边红包,所有开发者统一填写摇周边平台的商户号:1000052601 |
授权商户APPID | auth_appid | 是 | wxbf42bd79c4391863 | String(32) | 用于发红包时微信支付识别摇周边红包,所有开发者统一填写摇周边平台的appid:wxbf42bd79c4391863 |
风控设置 | risk_cntl | 是 | NORMAL | String(32) | 用于管控接口风险。具体值如下:NORMAL—正常情况;IGN_FREQ_LMT—忽略防刷限制,强制发放;IGN_DAY_LMT—忽略单用户日限额 限制,强制发放;IGN_FREQ_DAY_LMT—忽略防刷和单用户日限额限制,强制发放;如无特殊要求,请设为NORMAL。若忽略某项风险控制,可 能造成资金损失,请谨慎使用。 |
请求示例
<xml> <sign><![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]></sign> <mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno> <mch_id><![CDATA[10000097]]></mch_id> <wxappid><![CDATA[wxcbda96de0b165486]]></wxappid> <send_name><![CDATA[send_name]]></send_name> <hb_type><![CDATA[NORMAL]]></hb_type> <auth_mchid><![CDATA[10000098]]></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[50780e0cca98c8c8e814883e5caa672e]]></nonce_str> </xml>
返回数据说明
返回格式为xml
参数 | 字段 | 是否必须 | 示例值 | 类型 | 说明 |
---|---|---|---|---|---|
返回状态码 | return_code | 是 | SUCCESS | String(16) | SUCCESS/FAIL;此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断 |
返回信息 | return_msg | 否 | 签名失败 | String(128) | 返回信息,如非空,为错误原因 签名失败 参数格式校验错误 |
以下字段在return_code为SUCCESS的时候有返回
参数 | 字段 | 是否必须 | 示例值 | 类型 | 说明 |
---|---|---|---|---|---|
签名 | sign | 是 | C380BEC2BFD727A4B6845133519F3AD6 | String(32) | 生成签名方式查看 签名算法 |
业务结果 | result_code | 是 | SUCCESS | String(16) | SUCCESS/FAIL |
错误代码 | err_code | 否 | SUCCESS | String(32) | 错误码信息 |
错误代码描述 | err_code_des | 否 | 系统错误 | String(128) | 结果信息描述 |
以下字段在return_code 和result_code都为SUCCESS的时候有返回
参数 | 字段 | 是否必须 | 示例值 | 类型 | 说明 |
---|---|---|---|---|---|
商户订单号 | mch_billno | 是 | 10000098201411111234567890 | String(28) | 商户订单号(每个订单号必须唯一)组成: mch_id+yyyymmdd+10位一天内不能重复的数字。 |
商户号 | mch_id | 是 | 10000098 | String(32) | 微信支付分配的商户号 |
公众账号appid | wxappid | 是 | wx8888888888888888 | String(32) | 商户appid |
总金额 | total_amount | 是 | 1000 | int | 总付款金额,单位分 |
ticket | sp_ticket | 是 | 2J6MtR+SlbZ8Ga4EDi64X5
vC4Xv01ofX4uWOqqTc9kGJYhkq5 st5ucrXKxkjnC/UuvLeuhdIfiYg i4hJuJ95qjt9mwxqSBEmjGbZlL+ sqM9upoWsEjup28KPvaVrdao/Hg 6WqyqUL5E2zPHfM1sb1w== |
String | sp_ticket,一个普通红包对应一个ticket |
红包订单号 | detail_id | 是 | 0000000666201504290000042120 | 红包内部订单号 | |
发送时间 | 是 | 20150429203444 | 红包发放时间 |
成功示例
<xml> <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[0010010404201411170000046545]]></mch_billno> <mch_id>10010404</mch_id> <wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid> <sp_ticket><![CDATA[0cca98c8c8e814883]]></sp_ticket> <total_amount>3</total_amount> <detail_id><![CDATA[001001040420141117000004888]]></detail_id> <send_time><![CDATA[20150101080000]]></send_time> </xml>
失败示例
<xml> <return_code><![CDATA[FAIL]]></return_code> <return_msg><![CDATA[系统繁忙,请稍后再试.]]></return_msg> <result_code><![CDATA[FAIL]]></result_code> <err_code><![CDATA[268458547]]></err_code> <err_code_des><![CDATA[系统繁忙,请稍后再试.]]></err_code_des> <mch_billno><![CDATA[0010010404201411170000046542]]></mch_billno> <mch_id>10010404</mch_id> <wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid> <total_amount>3</total_amount> </xml>
/** * 摇一摇红包预下单 * @author jiosen */ class Yhb_pub extends Wxpay_client_pub { var $code;//code码,用以获取openid var $openid;//用户的openid function __construct() { //设置接口链接 $this->url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/hbpreorder"; //设置curl超时时间 $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT; } /** * 生成接口参数xml */ function createXml() { try { //检测必填参数 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;//用户openid $this->parameters["hb_type"] = 'NORMAL';//红包类型 NORMAL-普通红包;GROUP-裂变红包(可分享红包给好友,无关注公众号能力)。 $this->parameters["auth_mchid"] = '1000052601';//摇周边商户号 $this->parameters["auth_appid"] = 'wxbf42bd79c4391863';//摇周边 appid $this->parameters["risk_cntl"] = 'NORMAL';//风控设置 $this->parameters["sign"] = $this->getSign($this->parameters);//签名 return $this->arrayToXml($this->parameters); }catch (SDKRuntimeException $e) { die($e->errorMessage()); } } function hbpreorder() { $this->postXmlSSL(); $this->result = $this->xmlToArray($this->response); return $this->result; } /** * 作用:生成可以获得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?".$bizString; } /** * 作用:生成可以获得openid的url */ function createOauthUrlForOpenid() { $urlObj["appid"] = WxPayConf_pub::APPID; $urlObj["secret"] = WxPayConf_pub::APPSECRET; $urlObj["code"] = $this->code; $urlObj["grant_type"] = "authorization_code"; $bizString = $this->formatBizQueryParaMap($urlObj, false); return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString; } /** * 作用:通过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->openid; } /** * 作用:设置code */ function setCode($code_) { $this->code = $code_; } }
这里需要注意的是 auth_mchid 和 auth_appid 要填摇周边平台给出的appid 和商户号
<br /><br />调用 (这里不贴前端页面了)
$Redpack = new \Yhb_pub(); $Redpack->setParameter('mch_billno', WxPayConf_pub::MCHID.date('YmdHis').rand(1000, 9999)); //商户名称 $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[''])
<br /><br />
<span><strong>3.录入红包</strong></span>
接口说明
在调用"创建红包活动"接口之后,调用此接口录入红包信息。注意,此接口每次调用,都会向某个活动新增一批红包信息,如果红包数少于100 个,请通过一次调用添加所有红包信息。如果红包数大于100,可以多次调用接口添加。请注意确保多次录入的红包ticket总的数目不大于创建该红包活动 时设置的total值。
接口调用说明
服务器端调用 http请求方式: POST URL:https://api.weixin.qq.com/shakearound/lottery/setprizebucket?access_token=ACCESSTOKEN
请求参数说明
参数 | 类型 | 说明 |
---|---|---|
access_token | string | accesstoken,以参数的形式拼装在url后 |
POST BODY:JSON格式的结构体
参数 | 类型 | 说明 |
---|---|---|
lottery_id | string | 红包抽奖id,来自addlotteryinfo返回的lottery_id |
mchid | string | 红包提供者的商户号,,需与预下单中的商户号mch_id一致 |
sponsor_appid | string | 红包提供商户公众号的appid,需与预下单中的公众账号appid(wxappid)一致 |
prize_info_list | json数组 | 红包ticket列表,如果红包数较多,可以一次传入多个红包,批量调用该接口设置红包信息。每次请求传入的红包个数上限为100 |
ticket | string | 预下单时返回的红包ticket,单个活动红包ticket数量上限为100000个,可添加多次。 |
请求示例
Content-Type: application/json Post Body: { "lottery_id": "xxxxxxllllll", "mchid": "10000098", "sponsor_appid": "wx8888888888888888", "prize_info_list": [ { "ticket": "v1|ZiPs2l0hpMBp3uwGI1rwp45vOdz/V/zQ/00jP9MeWT+e47/q1FJjwCIP34frSjzOxAEzJ7k2CtAg1pmcShvkChBWqbThxPm6MBuzceoHtj79iHuHaEn0WAO+j4sXnXnbGswFOlDYWg1ngvrRYnCY3g==" }, { "ticket": "v1|fOhNUTap1oepSm5ap0hx1gmATM\/QX\/xn3sZWL7K+5Z10sbV5\/mZ4SwxwxbK2SPV32eLRvjd4ww1G3H5a+ypqRrySi+4oo97y63KoEQbRCPjbkyQBY8AYVyvD40V2b9slTQCm2igGY98mPe+VxZiayQ==" } ] }
返回数据说明
参数 | 类型 | 说明 |
---|---|---|
errcode | int | 错误码。0为成功,其他为失败。详细请参考错误码表 |
errmsg | string | 错误信息 |
repeat_ticket_list | array | 重复使用的ticket列表,如为空,将不返回 |
expire_ticket_list | array | 过期的ticket列表,如为空,将不返回 |
invalid_amount_ticket_list | array | 金额不在大于1元,小于1000元的ticket列表,如为空,将不返回 |
success_num | int | 成功录入的红包数量 |
wrong_authmchid_ticket_list | array | 原因:生成红包的时候,授权商户号auth_mchid和auth_appid没有写摇周边的商户号 |
invalid_ticket_list | array | 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;//code码,用以获取openid var $openid;//用户的openid function __construct($access_token) { //设置接口链接 $this->url = "https://api.weixin.qq.com/shakearound/lottery/setprizebucket?access_token=".$access_token; //设置curl超时时间 $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT; } /** * 生成接口参数 json */ function createJson() { try { //检测必填参数 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 return json_encode($this->parameters); //echo json_encode($this->parameters);die; }catch (SDKRuntimeException $e) { die($e->errorMessage()); } } function setJsonArray($parameter, $parameterValue){ $this->parameters[$this->trimString($parameter)] = $parameterValue; } function hbpreorder() { $data = $this->createJson(); $result = $this->curl_post($this->url,$data); $result = json_decode($result); return $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); return $rv; } /** * 作用:生成可以获得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?".$bizString; } /** * 作用:生成可以获得openid的url */ function createOauthUrlForOpenid() { $urlObj["appid"] = WxPayConf_pub::APPID; $urlObj["secret"] = WxPayConf_pub::APPSECRET; $urlObj["code"] = $this->code; $urlObj["grant_type"] = "authorization_code"; $bizString = $this->formatBizQueryParaMap($urlObj, false); return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString; } /** * 作用:通过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->openid; } /** * 作用:设置code */ function setCode($code_) { $this->code = $code_; } }
调用
<br /> $token = getAccessToken();<br /> $Redpack = new \lottery_pub($token);<br /> $lottery_id = ''; //这里读取数据库取出创建活动时返回的 lottery_id $Redpack->setParameter('lottery_id', $lottery_id); //活动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_token; $jo=0; if($access_token){ $data=array('ticket' =>$ticket); $rd=$this->curl_post($getshakeinfourl,json_encode($data)); $jo=json_decode($rd); }else{ echo 'access_token null'; } return $jo; } $ticket=$_GET['ticket'];//获叏设备信息,包括 U UID 、 major 、 minor ,以及距离、 openID 等信息 $token = getAccessToken(); $shake=getshakeinfo($token,$ticket); $openid=$shake->data->openid; $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=".$key; $sign = strtoupper(md5($signStr));
上一步返回的参数填在抢红包html页面
<script type="text/javascript" src="http://zb.weixin.qq.com/app/shakehb/BeaconShakehbJsBridge.js"> </script> <script type="text/javascript"> BeaconShakehbJsBridge.ready(function(){ //alert(); BeaconShakehbJsBridge.invoke('jumpHongbao',{lottery_id:"{$lottery_id}",noncestr:"{$noncestr}",openid:"{$openid}",sign:"{$sign}"}); }); </script>
红包绑定用户事件通知
接口说明
用户进入红包页面时,后台会将一个红包ticket和用户openid绑定,微信会把这个事件推送到开发者填写的URL(登录公众平台进入开发者中心设置)。推送内容包含用户openid,红包活动id,红包ticket、金额以及红包绑定时间。
注:红包绑定用户不等同于用户领取红包。用户进入红包页面后,有可能不拆红包,但该红包ticket已被绑定,不能再被其他用户绑定,过期后会退回商户财付通账户。
推送XML数据包示例
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1442824314</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[ShakearoundLotteryBind]]></Event> <LotteryId><![CDATA[lotteryid]]></LotteryId> <Ticket><![CDATA[ticket]]></Ticket> <Money>88</Money> <BindTime>1442824313</BindTime> </xml>
添加事件处理即可
/** * 事件处理 * @param unknown $object * @return string */ public function handleEvent($object) { // Event是事件类型(subscribe,LOCATION) $oneEvent = $object->Event; // EventKey是菜单事件的key值 $key = $object->EventKey; // 关注事件 if ($oneEvent == "subscribe" || $oneEvent == "SCAN") { if(!empty($object->Ticket)) { //扫码事件 .... } else { //关注事件 .... } }else if($oneEvent=="ShakearoundLotteryBind"){ //添加到数据库 }else if.......其他的事件...... }
完毕了.时间比较匆忙 也没时间做优化 大神经过顺便指导12 我好搓的英文基础
下面贴上完整WxPayPubHelper 集成了所有支付类 配置可用
<?php /*** WeChat 支払いヘルプ ライブラリ * ================================================ === ※インターフェースには3種類あります。 * [リクエストインターフェイス]--Wxpay_client_ * 統合支払インターフェイス クラス -- UnifiedOrder * 注文クエリ インターフェイス -- OrderQuery * 返金申請インターフェース -- 返金 * 返金クエリ インターフェース - RefundQuery * 請求書インターフェース - DownloadBill * ショートリンク変換インターフェース -- ShortUrl * [応答性の高いインターフェイス]--Wxpay_server_ * 一般的な通知インターフェイス -- 通知 * ネイティブ支払い - 加盟店に製品情報インターフェイスの取得を要求 - NativeCall * 【他の】 * 静的リンク QR コード - NativeLink * JSAPI決済--JsApi * ================================================ ==== ※【CommonUtil】よく使うツール: ※trimString()、パラメータ設定時に必要な文字処理関数 * createNoncestr()、32 ビット以下のランダムな文字列を生成します * formatBizQueryParaMap()、フォーマットパラメータ、署名プロセスに必要 * getSign()、署名を生成 * arrayToXml()、配列を XML に変換 * xmlToArray()、xml から配列へ * postXmlCurl()、投稿モードで対応するインターフェイス URL に XML を送信します * postXmlSSLCurl()、証明書を使用して、ポスト モードで対応するインターフェイス URL に XML を送信します*/ include_once("SDKRuntimeException.php"); include_once("WxPay.pub.config.php"); /*** すべてのインターフェースの基本クラス*/ クラス Common_util_pub { 関数 __construct() { } 関数トリム文字列($value) { $ret = null; if (null != $value) { $ret = $value; if (strlen($ret) == 0) { $ret = null; } } $ret を返します。 } /*** 機能: 32 ビット以下のランダムな文字列を生成します。*/ パブリック関数 createNoncestr( $length = 32 ) { $chars = "abcdefghijklmnopqrstuvwxyz0123456789"; $str =""; for ( $i = 0; $i < $length; $i++ ) { $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1); } $str を返します。 } /*** 機能: 署名プロセスに必要なフォーマットパラメータ*/ 関数 formatBizQueryParaMap($paraMap, $urlencode) { $buff = ""; ksort($paraMap); foreach ($paraMap as $k => $v) { if($urlencode) { $v = urlencode($v); } //$buff .= strto lower($k) . 「=」。 $v 。 "&"; $buff .= $k . 「=」。 $v 。 "&"; } $reqPar; if (strlen($buff) > 0) { $reqPar = substr($buff, 0, strlen($buff)-1); } $reqPar を返します。 } /*** 機能: 署名を生成*/ パブリック関数 getSign($Obj) { foreach ($Obj as $k => $v) { $パラメータ[$k] = $v; } //签名步骤一:按字典序排序パラメータ ksort($Parameters); $String = $this->formatBizQueryParaMap($Parameters, false); //echo '【string1】'.$String.'</br>'; //签名步骤二:文字列の後にKEYを追加 $String = $String."&key=".WxPayConf_pub::KEY; //echo "【string2】".$String."</br>"; //签名步骤三:MD5加密 $String = md5($String); //echo "【string3】 ".$String."</br>"; //签名步骤四:全字符转は大写 $result_ = strtoupper($String); //echo "【結果】 ".$result_."</br>"; $result_ を返します。 } /*** 関数: 配列を XML に変換*/ 関数 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 を返します。 } /*** 関数: XML を配列に変換します。*/ パブリック関数 xmlToArray($xml) { // XML を配列にします $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); $array_data を返します。 } /*** 機能: 投稿モードで対応するインターフェイス URL に XML を送信します。*/ パブリック関数 postXmlCurl($xml,$url,$秒=30) { //初期化カール $ch =curl_init(); //設置超時間 カール_setopt($ch, CURLOP_TIMEOUT, $秒); // ここに設置代理人がいる場合、その旨 //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); //設置ヘッダー curl_setopt($ch, CURLOPT_HEADER, FALSE); // 要求結果は文字列であり、画面上に出力されます curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //ポスト手渡し方式 curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); //カールを実行する $data =curl_exec($ch); カール_クローズ($ch); //返結果 if($data) { カール_クローズ($ch); $data を返します。 }それ以外 { $error =curl_errno($ch); echo "カール エラー、エラー コード: $error"."<br>"; echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>エラー原因クエリ</a></br>"; カール_クローズ($ch); false を返します。 } } /*** 機能: 証明書を使用して、ポスト モードで対応するインターフェイス URL に XML を送信します。*/ 関数 postXmlSSLCurl($xml,$url,$秒=30) { $ch =curl_init(); //残業時間 curl_setopt($ch,CURLOPT_TIMEOUT,$秒); // プロキシがある場合は、ここにプロキシを設定します //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); //ヘッダーを設定する curl_setopt($ch,CURLOPT_HEADER,FALSE); // 結果は文字列である必要があり、それを画面に出力します curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE); //証明書を設定する //証明書を使用します: 証明書とキーはそれぞれ 2 つの .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 ルート証明書 (Web サイト証明書が CA によって発行されたかどうかを確認するために使用されます) //ポスト送信メソッド curl_setopt($ch,CURLOPT_POST, true); curl_setopt($ch,CURLOPT_POSTFIELDS,$xml); $data =curl_exec($ch); //結果を返す if($data){ カール_クローズ($ch); $data を返します。 } それ以外 { $error =curl_errno($ch); echo "カール エラー、エラー コード: $error"."<br>"; echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>エラー原因クエリ</a></br>"; カール_クローズ($ch); false を返します。 } } /*** 関数: 配列を出力*/ 関数 printErr($wording='',$err='') { print_r('<pre class="brush:php;toolbar:false">'); echo $wording."</br>"; var_dump($err); print_r(''); } } /*** リクエストインターフェイスの基本クラス*/ クラス Wxpay_client_pub は Common_util_pub を拡張します { var $parameters;//リクエストパラメータ、タイプは連想配列です public $response; //WeChat から返された応答 public $result;//戻りパラメータ、型は連想配列 var $url;//インターフェースリンク var $curl_timeout;//カールのタイムアウト時間 /*** 機能: リクエストパラメータの設定*/ 関数 setParameter($parameter, $parameterValue) { $this->parameters[$this->trimString($parameter)] = $this->trimString($parameterValue); } /*** 機能: 標準リクエストパラメータの設定、署名の生成、インターフェースパラメータ XML の生成*/ 関数createXml() { $this->parameters["appid"] = WxPayConf_pub::APPID;//パブリック アカウント ID $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//販売者 ID $this->parameters["nonce_str"] = $this->createNoncestr();//ランダムな文字列 $this->parameters["sign"] = $this->getSign($this->parameters);//署名 return $this->arrayToXml($this->parameters); } /*** 機能: ポストリクエスト XML*/ 関数postXml() { $xml = $this->createXml(); $this->response = $this->postXmlCurl($xml,$this->url,$this->curl_timeout); $this->レスポンスを返す; } /*** 機能: 証明書ポストを使用して XML をリクエストします*/ 関数 postXmlSSL() { $xml = $this->createXml(); $this->response = $this->postXmlSSLCurl($xml,$this->url,$this->curl_timeout); $this->レスポンスを返す; } /*** 機能: 結果を取得します。デフォルトでは証明書は使用されません*/ 関数 getResult() { $this->postXml(); $this->result = $this->xmlToArray($this->response); $this->結果を返す; } } /*** 統合された支払いインターフェイス クラス*/ クラス UnifiedOrder_pub は Wxpay_client_pub を拡張します { function__construct() { //インターフェースリンクを設定する $this->url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; //カールのタイムアウトを設定する $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT; } /*** インターフェースパラメータ XML を生成*/ 関数createXml() { 試す { //必要なパラメータを検出する if($this->parameters["out_trade_no"] == null) { throw new SDKRuntimeException("統合決済インターフェイスの必須パラメータ out_trade_no が見つかりません!"."
"); }elseif($this->parameters["body"] == null){ throw new SDKRuntimeException("統合決済インターフェイスの必須パラメータ本体が見つかりません!"."
"); }elseif ($this->parameters["total_fee"] == null ) { throw new SDKRuntimeException("統合支払いインターフェイスの必須パラメータ total_fee がありません!"."
"); }elseif ($this->parameters["notify_url"] == null) { throw new SDKRuntimeException("統合決済インターフェイスの必須パラメータnotify_urlが見つかりません!"."
"); }elseif ($this->parameters["trade_type"] == null) { throw new SDKRuntimeException("統合決済インターフェイスの必須パラメータ trade_type がありません!"."
"); }elseif ($this->parameters["trade_type"] == "JSAPI" && $this->parameters["openid"] == NULL){ throw new SDKRuntimeException("統合決済インターフェイスに必須パラメータ openid がありません! trade_type が JSAPI の場合、openid は必須パラメータです!"."
"); } $this->parameters["appid"] = WxPayConf_pub::APPID;//パブリック アカウント ID $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//販売者 ID $this->parameters["spbill_create_ip"] = $_SERVER['REMOTE_ADDR'];//ターミナルIP $this->parameters["nonce_str"] = $this->createNoncestr();//ランダムな文字列 $this->parameters["sign"] = $this->getSign($this->parameters);//署名 return $this->arrayToXml($this->parameters); }catch (SDKRuntimeException $e) { die($e->errorMessage()); } } /*** prepay_id を取得する*/ 関数 getPrepayId() { $this->postXml(); $this->result = $this->xmlToArray($this->response); $prepay_id = $this->result["prepay_id"]; $prepay_id を返します; } } /*** 注文クエリインターフェイス*/ クラス OrderQuery_pub は Wxpay_client_pub を拡張します { function__construct() { //インターフェースリンクを設定する $this->url = "https://api.mch.weixin.qq.com/pay/orderquery"; //カールのタイムアウトを設定する $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT; } /*** インターフェースパラメータ XML を生成*/ 関数createXml() { 試す { //必要なパラメータを検出する if($this->parameters["out_trade_no"] == null && $this->parameters["transaction_id"] == null) { throw new SDKRuntimeException("注文クエリ インターフェイスで、少なくとも 1 つの out_trade_no とtransaction_id を入力してください!"."
"); } $this->parameters["appid"] = WxPayConf_pub::APPID;//パブリック アカウント ID $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//販売者 ID $this->parameters["nonce_str"] = $this->createNoncestr();//ランダムな文字列 $this->parameters["sign"] = $this->getSign($this->parameters);//署名 return $this->arrayToXml($this->parameters); }catch (SDKRuntimeException $e) { die($e->errorMessage()); } } } /*** 返金申請インターフェース*/ クラスRefund_pubはWxpay_client_pubを拡張します { 関数 __construct() { //インターフェースリンクを設定する $this->url = "https://api.mch.weixin.qq.com/secapi/pay/refund"; //カールのタイムアウトを設定する $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT; } /*** インターフェースパラメータ XML を生成*/ 関数createXml() { 試す { //必要なパラメータを検出する if($this->parameters["out_trade_no"] == null && $this->parameters["transaction_id"] == null) { throw new SDKRuntimeException("返金アプリケーション インターフェイスで、少なくとも 1 つの out_trade_no とtransaction_id を入力してください!"."
"); }elseif($this->parameters["out_refund_no"] == null){ throw new SDKRuntimeException("返金アプリケーション インターフェイスに、必須パラメータ out_refund_no がありません!"."
"); }elseif($this->parameters["total_fee"] == null){ throw new SDKRuntimeException("返金アプリケーション インターフェイスに、必須パラメータ total_fee がありません!"."
"); }elseif($this->parameters["refund_fee"] == null){ throw new SDKRuntimeException("返金アプリケーション インターフェイスに、必要なパラメータrefund_feeがありません!"."
"); }elseif($this->parameters["op_user_id"] == null){ throw new SDKRuntimeException("返金アプリケーション インターフェイスに、必須パラメータ op_user_id がありません。"."
"); } $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);//签名 return $this->arrayToXml($this->parameters); }catch (SDKRuntimeException $e) { die($e->errorMessage()); } } /*** 機能: 結果の取得と証明書を使用した通信*/ 関数 getResult() { $this->postXmlSSL(); $this->result = $this->xmlToArray($this->response); $this->結果を返す; } } /*** 返金問い合わせインターフェース*/ クラスRefundQuery_pubはWxpay_client_pubを拡張します { 関数 __construct() { // インターフェイス接続を設定します $this->url = "https://api.mch.weixin.qq.com/pay/refundquery"; //カールを設定します超時間 $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT; } /*** インターフェースパラメータ XML を生成*/ 関数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四个パラメータ必須一个!"."
"); } $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);//签名 return $this->arrayToXml($this->parameters); }catch (SDKRuntimeException $e) { die($e->errorMessage()); } } /*** 機能: 結果の取得と証明書を使用した通信*/ 関数 getResult() { $this->postXmlSSL(); $this->result = $this->xmlToArray($this->response); $this->結果を返す; } } /*** 請求インターフェース*/ クラス DownloadBill_pub は Wxpay_client_pub を拡張します { 関数 __construct() { // インターフェイス接続を設定します $this->url = "https://api.mch.weixin.qq.com/pay/downloadbill"; //カールを設定します超時間 $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT; } /*** インターフェースパラメータ XML を生成*/ 関数createXml() { 試す { if($this->parameters["bill_date"] == null ) { throw new SDKRuntimeException("对账单接口中,缺少必装パラメータbill_date!"."
"); } $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);//签名 return $this->arrayToXml($this->parameters); }catch (SDKRuntimeException $e) { die($e->errorMessage()); } } /*** 機能: 結果を取得します。デフォルトでは証明書は使用されません*/ 関数 getResult() { $this->postXml(); $this->result = $this->xmlToArray($this->result_xml); $this->結果を返す; } } /*** ショートリンク変換インターフェース*/ クラス ShortUrl_pub は Wxpay_client_pub を拡張します { 関数 __construct() { // インターフェイス接続を設定します $this->url = "https://api.mch.weixin.qq.com/tools/shorturl"; //カールを設定します超時間 $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT; } /*** インターフェースパラメータ XML を生成*/ 関数createXml() { 試す { if($this->parameters["long_url"] == null ) { throw new SDKRuntimeException("短链接转换接口中,缺少必須充填パラメータlong_url!"."
"); } $this->parameters["appid"] = WxPayConf_pub::APPID;//パブリック アカウント ID $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//販売者 ID $this->parameters["nonce_str"] = $this->createNoncestr();//ランダムな文字列 $this->parameters["sign"] = $this->getSign($this->parameters);//署名 return $this->arrayToXml($this->parameters); }catch (SDKRuntimeException $e) { die($e->errorMessage()); } } /*** prepay_id を取得する*/ 関数 getShortUrl() { $this->postXml(); $prepay_id = $this->result["short_url"]; $prepay_id を返します; } } /***レスポンシブインターフェイスの基本クラス*/ クラス Wxpay_server_pub は Common_util_pub を拡張します { public $data;//受信データ、型は連想配列 var $returnParameters; // パラメータを返します。型は連想配列です。 /*** データ処理を容易にするために、WeChat のリクエスト XML を連想配列に変換します。*/ 関数 saveData($xml) { $this->data = $this->xmlToArray($xml); } 関数 checkSign() { $tmpData = $this->data; unset($tmpData['sign']); $sign = $this->getSign($tmpData);//ローカル署名 if ($this->data['sign'] == $sign) { TRUEを返します。 } FALSEを返します。 } /*** WeChatリクエストデータの取得*/ 関数 getData() { $this->データを返す; } /*** WeChatに返されるXMLデータを設定します*/ 関数 setReturnParameter($parameter, $parameterValue) { $this->returnParameters[$this->trimString($parameter)] = $this->trimString($parameterValue); } /*** インターフェースパラメータ XML を生成*/ 関数createXml() { return $this->arrayToXml($this->returnParameters); } /*** XMLデータをWeChatに返す*/ 関数 returnXml() { $returnXml = $this->createXml(); $returnXml を返します。 } } /*** ユニバーサル通知インターフェース*/ クラス Notify_pub は Wxpay_server_pub を拡張します { } /*** 加盟店に製品情報インターフェースの取得を要求します*/ クラス NativeCall_pub は Wxpay_server_pub を拡張します { /*** インターフェースパラメータ XML を生成*/ 関数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 を取得します*/ 関数 getProductId() { $product_id = $this->data["product_id"]; $product_id を返します; } } /*** 静的リンク QR コード*/ クラス NativeLink_pub は Common_util_pub を拡張します { var $parameters; //静的リンクパラメータ var $url;//静的リンク function__construct() { } /***パラメータの設定*/ 関数 setParameter($parameter, $parameterValue) { $this->parameters[$this->trimString($parameter)] = $this->trimString($parameterValue); } /*** ネイティブ支払いリンク QR コードを生成します*/ 関数createLink() { 試す { if($this->parameters["product_id"] == null) { throw new SDKRuntimeException("ネイティブ支払い QR コード リンクの必須パラメータ product_id がありません!"."
"); } $this->parameters["appid"] = WxPayConf_pub::APPID;//パブリック アカウント ID $this->parameters["mch_id"] = WxPayConf_pub::MCHID;//販売者 ID $time_stamp = 時間(); $this->parameters["time_stamp"] = "$time_stamp";//タイムスタンプ $this->parameters["nonce_str"] = $this->createNoncestr();//ランダムな文字列 $this->parameters["sign"] = $this->getSign($this->parameters);//署名 $bizString = $this->formatBizQueryParaMap($this->パラメータ, false); $this->url = "weixin://wxpay/bizpayurl?".$bizString; }catch (SDKRuntimeException $e) { die($e->errorMessage()); } } /*** リターンリンク*/ 関数getUrl() { $this->createLink(); $this->urlを返します; } } /*** JSAPI 支払い - H5 Web ページが支払いインターフェイスを呼び出します*/ クラス JsApi_pub は Common_util_pub を拡張します { var $code;//openid を取得するコードを記述します var $openid;//ユーザーのopenid var $parameters;//jsapi パラメータ、形式は json var $prepay_id;// 統合された支払いインターフェースを使用して取得された前払い ID var $curl_timeout;//カールのタイムアウト時間 function__construct() { //カールのタイムアウトを設定する $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT; } /*** 機能: コードを取得できる URL を生成します。*/ 関数 createOauthUrlForCode($redirectUrl) { $urlObj["appid"] = WxPayConf_pub::APPID; $urlObj["redirect_uri"] = "$redirectUrl"; $urlObj["応答タイプ"] = "コード"; $urlObj["スコープ"] = "snsapi_base"; $urlObj["状態"] = "状態"."#wechat_redirect"; $bizString = $this->formatBizQueryParaMap($urlObj, false); return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString; } /*** 機能: openidを取得できるURLを生成*/ 関数 createOauthUrlForOpenid() { $urlObj["appid"] = WxPayConf_pub::APPID; $urlObj["シークレット"] = WxPayConf_pub::APPSECRET; $urlObj["コード"] = $this->コード; $urlObj["認可タイプ"] = "認可コード"; $bizString = $this->formatBizQueryParaMap($urlObj, false); return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString; } /*** 機能:curl を介してコードを WeChat に送信し、openid を取得します。*/ 関数 getOpenid() { $url = $this->createOauthUrlForOpenid(); //カールを初期化する $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); カール_クローズ($ch); //openidを取得する $data = json_decode($res,true); $this->openid = $data['openid']; $this->openid を返す; } /*** 機能: prepay_id を設定します*/ 関数 setPrepayId($prepayId) { $this->prepay_id = $prepayId; } /*** 機能: コードを設定します。*/ 関数 setCode($code_) { $this->コード = $code_; } /*** 機能: jsapi のパラメータを設定します*/ パブリック関数 getParameters() { $jsApiObj["appId"] = WxPayConf_pub::APPID; $timeStamp = 時間(); $jsApiObj["タイムスタンプ"] = "$タイムスタンプ"; $jsApiObj["nonceStr"] = $this->createNoncestr(); $jsApiObj["パッケージ"] = "prepay_id=$this->prepay_id"; $jsApiObj["signType"] = "MD5"; $jsApiObj["paySign"] = $this->getSign($jsApiObj); $this->parameters = json_encode($jsApiObj); $this->パラメータを返す; } } /***現金赤い封筒インターフェイス * @作者gaoyl101*/ クラス Redpack_pub は Wxpay_client_pub を拡張します { var $code;//openid を取得するコードを記述します var $openid;//ユーザーのopenid function__construct() { //インターフェースリンクを設定する $this->url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack"; //カールのタイムアウトを設定する $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT; } /*** インターフェースパラメータ XML を生成*/ 関数createXml() { 試す { //必要なパラメータを検出する if($this->parameters["mch_billno"] == null) { throw new SDKRuntimeException("赤い封筒送信インターフェイスに必要なパラメータ mch_billno がありません!"."
"); }elseif($this->parameters["nick_name"] == null){ throw new SDKRuntimeException("赤い封筒の送信インターフェイスに必要なパラメーター nick_name がありません!"."
"); }elseif ($this->parameters["send_name"] == null ) { throw new SDKRuntimeException("赤い封筒の送信インターフェイスに必要なパラメーター send_name がありません!"."
"); }elseif ($this->parameters["total_amount"] == null) { throw new SDKRuntimeException("赤い封筒送信インターフェイスに必要なパラメーター total_amount が見つかりません!"."
"); }elseif($this->parameters["min_value"] == null){ throw new SDKRuntimeException("赤い封筒送信インターフェイスに必要なパラメータ min_value がありません!"."
"); }elseif ($this->parameters["max_value"] == null ) { throw new SDKRuntimeException("赤い封筒送信インターフェイスに必要なパラメータ max_value がありません!"."

PHPは、特にWeb開発の分野で、最新のプログラミングで強力で広く使用されているツールのままです。 1)PHPは使いやすく、データベースとシームレスに統合されており、多くの開発者にとって最初の選択肢です。 2)動的コンテンツ生成とオブジェクト指向プログラミングをサポートし、Webサイトを迅速に作成および保守するのに適しています。 3)PHPのパフォーマンスは、データベースクエリをキャッシュおよび最適化することで改善でき、その広範なコミュニティと豊富なエコシステムにより、今日のテクノロジースタックでは依然として重要になります。

PHPでは、弱い参照クラスを通じて弱い参照が実装され、ガベージコレクターがオブジェクトの回収を妨げません。弱い参照は、キャッシュシステムやイベントリスナーなどのシナリオに適しています。オブジェクトの生存を保証することはできず、ごみ収集が遅れる可能性があることに注意する必要があります。

\ _ \ _ Invokeメソッドを使用すると、オブジェクトを関数のように呼び出すことができます。 1。オブジェクトを呼び出すことができるように\ _ \ _呼び出しメソッドを定義します。 2。$ obj(...)構文を使用すると、PHPは\ _ \ _ Invokeメソッドを実行します。 3。ロギングや計算機、コードの柔軟性の向上、読みやすさなどのシナリオに適しています。

繊維はPhp8.1で導入され、同時処理機能が改善されました。 1)繊維は、コルーチンと同様の軽量の並行性モデルです。 2)開発者がタスクの実行フローを手動で制御できるようにし、I/O集約型タスクの処理に適しています。 3)繊維を使用すると、より効率的で応答性の高いコードを書き込むことができます。

PHPコミュニティは、開発者の成長を支援するための豊富なリソースとサポートを提供します。 1)リソースには、公式のドキュメント、チュートリアル、ブログ、LaravelやSymfonyなどのオープンソースプロジェクトが含まれます。 2)StackOverFlow、Reddit、およびSlackチャネルを通じてサポートを取得できます。 3)開発動向は、RFCに従うことで学ぶことができます。 4)コミュニティへの統合は、積極的な参加、コード共有への貢献、および学習共有への貢献を通じて達成できます。

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

PHPは死にかけていませんが、常に適応して進化しています。 1)PHPは、1994年以来、新しいテクノロジーの傾向に適応するために複数のバージョンの反復を受けています。 2)現在、電子商取引、コンテンツ管理システム、その他の分野で広く使用されています。 3)PHP8は、パフォーマンスと近代化を改善するために、JITコンパイラおよびその他の機能を導入します。 4)Opcacheを使用してPSR-12標準に従って、パフォーマンスとコードの品質を最適化します。

PHPの将来は、新しいテクノロジーの傾向に適応し、革新的な機能を導入することで達成されます。1)クラウドコンピューティング、コンテナ化、マイクロサービスアーキテクチャに適応し、DockerとKubernetesをサポートします。 2)パフォーマンスとデータ処理の効率を改善するために、JITコンパイラと列挙タイプを導入します。 3)パフォーマンスを継続的に最適化し、ベストプラクティスを促進します。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

Dreamweaver Mac版
ビジュアル Web 開発ツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SublimeText3 中国語版
中国語版、とても使いやすい
