最近、あるプロジェクトを引き受けましたが、シェイクレッドエンベロープ機能を実装する必要があり、長い間オンラインで検索しましたが、できませんでした。ソースコードを見つける方法はありませんでした。私が自動的に作成したものです。この記事はあなたの参考のために私の努力の成果を共有します。意見を共有し、一緒に学び、進歩することができます。
WeChatの公式説明は以下の通りです
赤い封筒の説明書を振ってください
機能説明
周囲の赤い封筒を振るインターフェイスは、オフライン加盟店向けに提供される赤い封筒発行機能です。ユーザーは加盟店などのオフラインの場所で周囲を振ることで加盟店が発行する赤い封筒を受け取ることができます。オンライン転送や共有は無効です。
開発者はインターフェイスを通じてシェイクレッドエンベロープ機能を開発できます:
1. テンプレート読み込みページまたはカスタム HTML5 ページを使用して、WeChat ネイティブの赤い封筒ページを呼び出すことを選択できます (詳細については、赤い封筒作成アクティビティの use_template フィールドを参照してください。1 ではテンプレートを使用し、2 ではテンプレートを使用します)カスタム HTML5 ページ)
2. ネイティブの赤い封筒ページで赤い封筒を開くには、公開アカウントのメッセージを通じて送信する必要はありません
3. 公開アカウントをフォローする機能を提供し、ユーザーはアカウントをフォローするかどうかを選択できます (核分裂の赤い封筒を共有する場合は無効です)
4. 完成したページには、マーチャントの他のカスタマイズされた HTML5 ページにジャンプできるジャンプ リンクを設定できます
5. 同じユーザーは、1 つの赤い封筒イベントで 1 つの赤い封筒しか受け取ることができません
ユーザー側の対話プロセス
赤いエンベロープコンポーネントインターフェース呼び出しプロセス
1. 赤い封筒インターフェイスの許可を申請する: https://zb.weixin.qq.com でシェイク アンド シェイク マーチャントのバックエンドにログインし、開発者サポートに入り、シェイク アンド シェイク レッド エンベロープ コンポーネントを開くために申請します。インターフェース
2. 赤い封筒の事前注文: WeChat 決済 API を呼び出して赤い封筒の事前注文を行い、配布する赤い封筒の量と人数を通知し、赤い封筒のチケットを生成します。
3. イベントを作成し、赤い封筒の情報を入力します。Shake ペリフェラル プラットフォームの API を呼び出して赤い封筒のアクティビティを作成し、情報を入力し、注文時に生成された赤い封筒のチケットを渡します。
4. jsapi を呼び出して赤い封筒を描画します。シェイクアウト ページで、jsapi を呼び出して赤い封筒を描画します。赤い封筒を獲得したユーザーは、赤い封筒を開くことができます。
5. 上記のインターフェイスを呼び出すときは、赤い封筒プロバイダーと赤い封筒発行業者のパブリック アカウント要件が一致している必要があります。
説明:
赤い封筒プロバイダー: 赤い封筒の事前注文インターフェイスを通じて渡されるパラメーター wxappid で表される販売者 赤い封筒を発行する販売者: 赤い封筒のインターフェイスを呼び出して赤い封筒のアクティビティを作成し、赤い封筒の情報を入力し、赤い封筒の販売者公開アカウントを発行します。そのため、手順は、① 赤い封筒のアクティビティを作成する、② 事前に注文する、③ 赤い封筒を入力する、ということになります。以前に開催されたクラスを見つけて書き留めます 1. イベントを作成します
インターフェースの説明
赤い封筒アクティビティを作成し、赤い封筒アクティビティの有効期間、赤い封筒アクティビティのスイッチ、その他の基本情報を設定し、アクティビティIDを返します
インターフェース呼び出し手順
サーバー側の呼び出し
httpリクエストメソッド:POST URL: https://api.weixin.qq.com/shakearound/lottery/addlotteryinfo?access_token=ACCESSTOKEN&use_template=1&logo_url=LOGO_URL
リクエストパラメータの説明
リクエスト例
リーリー 戻りデータの説明
例
リーリー 送信されるデータはxmlではなくjsonであることに注意してください
フロントエンドページを作るだけ
phpコード
リーリー 2. 事前注文
インターフェースの説明
赤い封筒1枚の金額や種類などを設定し、赤い封筒情報を生成します。予約注文後、赤い封筒の描画操作を完了するには、72 時間以内に jsapi を呼び出す必要があります。 (赤い封筒の有効期限が切れると、資金は販売者の Tenpay アカウントに返金されます。)
インターフェース呼び出し手順
httpリクエストメソッド:POST
https://api.mch.weixin.qq.com/mmpaymkttransfers/hbpreorder
POSTデータ形式:XML
販売者証明書が必要です
リクエストパラメータの説明
请求示例
<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>
返回数据说明
以下字段在return_code 和result_code都为SUCCESS的时候有返回
成功示例
<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 和商户号
调用 (这里不贴前端页面了)
$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[''])
3.录入红包
接口说明
在调用"创建红包活动"接口之后,调用此接口录入红包信息。注意,此接口每次调用,都会向某个活动新增一批红包信息,如果红包数少于100 个,请通过一次调用添加所有红包信息。如果红包数大于100,可以多次调用接口添加。请注意确保多次录入的红包ticket总的数目不大于创建该红包活动 时设置的total值。
接口调用说明
服务器端调用
http请求方式: POST
URL:https://api.weixin.qq.com/shakearound/lottery/setprizebucket?access_token=ACCESSTOKEN
请求参数说明
POST BODY:JSON格式的结构体
请求示例
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":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 が見つかりません!"."