Laravel 微信å¼åç»ä»¶-WeChat 微信æ¯ä»
ä¸ãä»ç»
æ¬æç¨æ¯LAMPå¼åç¯å¢ä¸åºäºlarvel5.1LTSçè¿è¡çå¼åå®ä¾ã
ç±äºç°å¨å½å
æå¾å¤ä¼ç§ä¸å
·å¤å¼æºç²¾ç¥çphpå¼åè
ï¼å æ¤åºäºè约æ¶é´ææ¬åç»´æ¤ææ¬çèèï¼å¾®ä¿¡å¼åéç¨ç»ä»¶åå¼åï¼æ们没å¿
è¦éå¤é è½®åãæ¬æç¨éç¨ overtrue å¢éç easywechat ç»ä»¶è¿è¡å¾®ä¿¡çæ¯ä»åè½å¼ååå®ç°ã
ç±äºè¿ä¸ªç»ä»¶åè½è¿å¤ æ¬ç¯å客主è¦ä»ç»âæ«ç æ¯ä»âç主è¦æµç¨åæè·¯ã
äºãcomposerå®è£
é»è®¤å¤§å®¶å·²ç»å¨èªå·±çå¼åç¯å¢ä¸å·²ç»å®è£
äºcomposerï¼å¹¶ä¼ä¸äºç®åçæä½ï¼å®è£
å½ä»¤ï¼
composer require "overtrue/laravel-wechat:~3.0"
* å¦æä½ ç¨äº laravel-debugbarï¼è¯·ç¦ç¨æè
å
³æï¼å¦åè¿æ¨¡åå«æ³æ£å¸¸ä½¿ç¨ï¼ï¼ï¼ * ï¼ä½æ¯composeræ示æ¯å¦å¯ä»¥å
³éx-debugï¼ä¼å½±åå®è£
ä¹ç±»çæ示ï¼å¯ä»¥ä¸å»ç®¡å®ï¼
ä¸ãå¨laravelä¸è¿è¡é
ç½®
1.注å ServiceProvider ï¼æ¾å° config/app.php é
ç½®æ件ä¸ï¼key为 providers çæ°ç»ï¼å¨æ°ç»ä¸æ·»å æå¡æä¾è
ï¼:
Overtrue\LaravelWechat\ServiceProvider::class,
2.ï¼å¯éï¼æ·»å * å¤è§ * å¨app/config/app.php ç aliases æ°ç»éï¼æ·»å * å«å * :
'wechat' =>Overtrue\LaravelWechat\ServiceProvider::class,
3.å建é
ç½®æ件ï¼å¨é¡¹ç®æ ¹ç®å½ä¸è¿è¡ artisan å½ä»¤ï¼åå¸é
ç½®æ件å°ä½ ç项ç®ä¸ï¼ï¼
php artisan vendor:publish
æ¤æ¶å¨/configç®å½ä¸ä¼çæé
ç½®æ件wechat.php,å¨éé¢è¾å
¥ä½ ç微信å家信æ¯ï¼è¿é请注æä¿æ¤éç§ã
åã 微信æ¯ä»é£èµ·
1.é
置微信å家信æ¯ï¼laravelæ ¹ç®å½ä¸ç.ENVæ件æ¯æ以ä¸é
ç½®ï¼
WECHAT_APPID
WECHAT_SECRET
WECHAT_TOKEN
WECHAT_AES_KEY
WECHAT_LOG_LEVEL
WECHAT_LOG_FILE
WECHAT_OAUTH_SCOPES
WECHAT_OAUTH_CALLBACK
WECHAT_PAYMENT_MERCHANT_ID
WECHAT_PAYMENT_KEY
WECHAT_PAYMENT_CERT_PATH
WECHAT_PAYMENT_KEY_PATH
WECHAT_PAYMENT_DEVICE_INFO
WECHAT_PAYMENT_SUB_APP_ID
WECHAT_PAYMENT_SUB_MERCHANT_ID
WECHAT_ENABLE_MOCK
ä½ å¯ä»¥å¨/config/wechat.phpä¸è¿è¡ç¸å
³åæ°é
ç½®ï¼ä¹å¯ä»¥åå¨.ENVæ件ä¸ï¼ç¶åï¼wechat.phpå
·ä½è¯»åæ¹æ³ï¼
'notify_url' => env('NOTIFY_URL', '
http://www.XXXXX.com/notify_url'), // åè°å°å
env()é»è®¤è¯»å.envæ件ä¸å¸¸éçå¼ï¼å¦æ.envä¸æ²¡æå®ä¹è¯¥å¸¸éï¼åè¿åenv()ç第äºä¸ªåæ°çå¼ã
2.wechat.phpæ件ä¸éè¦æ³¨æçå°æ¹
ï¼1ï¼.'log'æ°ç»å
æ¯æ¥å¿é
ç½®ã
ï¼2ï¼.'payment'æ°ç»æ¯ä¸»è¦é
ç½®çæ°ç»ï¼ä¸»è¦é
ç½®åæ·çä¿¡æ¯åè¯ä¹¦ã
3.ï¼éç¹ï¼å建订å
ï¼1ï¼.å¼å
¥å½å空é´
use EasyWeChat\Foundation\Application;
use EasyWeChat\Payment\Order;
ï¼2ï¼.å¡«å订åä¿¡æ¯
$attributes = [
'trade_type' => 'JSAPI', // JSAPIï¼NATIVEï¼APP...
'body' => 'iPad mini 16G ç½è²',
'detail' => 'iPad mini 16G ç½è²',
'out_trade_no' => '1217752501201407033233368018',
'total_fee' => 5388,
'notify_url' => '
http://xxx.com/order-notify', // æ¯ä»ç»æéç¥ç½åï¼å¦æä¸è®¾ç½®åä¼ä½¿ç¨é
ç½®éçé»è®¤å°åï¼æ就没æå¨è¿éé
ï¼å 为å¨.envå
å·²ç»é
ç½®äºã
// ...
];
// å建订å
$order = new Order($attributes);
$result = $payment->prepare($order);
if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS')
{
//ç产é£ä¸ªè®¢ååçé»è¾
\Log::info('çæ订åå·..'.$data->order_guid);
//è¿ä¸åæ¯ä»¥ajaxå½¢å¼è¿åå°é¡µé¢ä¸ã
//ç¨æ·çä½éªå°±æ¯ç¹å»ã确认æ¯ä»ãï¼éªè¯ç 以弹å±é¡µé¢åºæ¥äºï¼æ²¡éï¼è¿éè¦ä¸ä¸ªå¥½ç¨çå¼¹å±jsï¼ã
$ajax_data=[
'html' => json_encode(\QrCode::size(250)->generate($result['code_url'])),
'out_trade_no' => $data->order_guid,
'price' => $data->price
];
return $ajax_data;
}else{
return back()->withErrors('çæ订åé误ï¼');
}
äºã渲æ页é¢
è¿éå建äºè®¢åï¼éè¦çæäºç»´ç å¾çï¼å¯ä»¥åèä¸ä¸è¿ä¸ªäºç»´ç å¾çç»ä»¶ã
Composer 设置
é¦å
,æ·»å QrCode å
æ·»å å°ä½ ç composer.json æ件ç require é:
composer require "simplesoftwareio/simple-qrcode"
æ·»å Service Provider
注å SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class è³ config/app.php ç providers æ°ç»é.
æ·»å Aliases
æå,注å 'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class è³ config/app.php ç aliases æ°ç»é.
pay.blade.phpå
容
<script type="text/javascript" src="{{ asset('vendor/jquery.js') }}"></script>
<script type="text/javascript" src="{{ asset('layer/layer.js') }}"></script>
<input class="wechat_btn" type="button" value="确认æ¯ä»"/>
{!-- è¿ä¸ªé¡µé¢éè¦æä¸äºjs代ç ï¼æè½ä½¿æ¯ä»åè½æ´å ç¾è§å¯ç¨æ bugï¼æ¯å¦ajax轮询ï¼ç¹å»æ¯ä»åçbtn失æï¼æ¾å¼æ¯ä»æ¶å
³éå¼¹å±çç --}
jså
容
$('.wechat_btn').click(function() {
$('.my_order_guid').val('');
$('#code').val('');
//ajaxçæäºç»´ç
data={
'_token':$(".token").val(),//令ç
'money':$(".money").val(),//ååä»·æ ¼
}
sendAjax(data, "/order", function (data) {
//åéäºç»´ç è¿æ¥ï¼æ¤å¤ä½¿ç¨ä¼ç¾çlayerå¼¹å±åºï¼
layer.open({
type: 1,
title:'微信æ¯ä»',
skin: 'layui-layer-rim', //å ä¸è¾¹æ¡
area: ['270px', '340px'], //宽é«
content: "<p style='color:red;text-align: center;'>æ¯ä»éé¢ï¼"+data['price']
+"å
</p> <input type='hidden' class='my_order_guid' value='"+data['out_trade_no']
+"'/><div id='code' style='text-align: center;'>"+JSON.parse(data['html'])+
"</div><p style='text-align: center;'>请使ç¨å¾®ä¿¡æ«ç æ¯ä»</p><script> $('.layui-layer-close').click(function() { layer.msg('æ¨å·²æ¾å¼æ¬æ¬¡æ¯ä»');setTimeout('window.location.reload()',3000); });</script>"
//è¿éææå¼¹å±åºæå
³çä¸ç¹ç¹jsåå°contentéé¢å»äºã
});
getInfo();
//è¿éåä¸ä¸ªè½®è¯¢ï¼å¯ä»¥å¼æ¥æ¥è¯¢è®¢åæ¯å¦æ¯ä»å®æçä¿¡æ¯ï¼ä»èè¿è¡é»è¾å¤çï¼æ¯å¦è½®è¯¢æ¯ä»ç¶æï¼æåäºè·³è½¬é¡µé¢ï¼ï¼ä»
ä»
æç¹ä¸ä¸æçæ³æ³ï¼è½®è¯¢ç代ç ä¸ç¨æ¾ï¼æ²¡æè´´ã
});
});
å
ãåè°å½æ°
å
æ¾ä¸ä¸»è¦ä»£ç å说ï¼
public function notifyUrl(Request $request)
{
$app = new Application(config('wechat'));
$response = $app->payment->handleNotify(function($notify, $successful){
if ($successful) {
$order_arr=json_decode($notify,true);
$order_guid=$order_arr['out_trade_no'];//订åå·
//åè°æåçé»è¾
}
});
}
注æ
ï¼1ï¼.wechatåéåè°æ¯éè¿postæ¹å¼ï¼å¨è·¯ç±å¤å®ä¹äºä¹åï¼è¿éè¦å¨laravel项ç®ä¸æé¤tokenéªè¯ï¼æ建议å¨ä¸é´ä»¶ä¸VerifyCsrfToken.phpè¿è¡æé¤è·¯ç±ã
protected $except = [
//
'/pay_success_notify',
'/To_rule_out_route'
];
ï¼2ï¼. * éç¹ï¼éç¹ï¼éç¹ï¼ * åè°è¿éçå¤çå¯ä»¥è¯´æ¯éä¸ä¹éï¼è¿éåºå²åï¼å¯è½ä¼é æ ç¨æ·æ¯ä»æååï¼å¾®ä¿¡ç * åè°æ²¡æè¿æ¥ * ï¼åå°åè°çé»è¾å°±æ²¡ææ§è¡ï¼å¯¼è´ç¨æ·é±è±äºï¼ä¸è¥¿æ²¡ä¹°ä¸ï¼å³ä½ çæå¡å¨ä¸æ²¡ææ§è¡ç»ä»è´¹ç¨æ·ä¿®æ¹æ¯ä»ç¶æçæ°æ®åºæä½ï¼ãå¦ä¸ç§åæï¼å¦æ没ææ£ç¡®è¿å微信åæ°ï¼å¾®ä¿¡ä¼å¤æ¬¡åéåè°ä¿¡æ¯æ¥æéä½ æ¯ä»æåäºï¼å¯¼è´ä½ çæå¡å¨ * æ¥ååè°å½æ°å¤é * ãèæ¤æ¶ä½ ä¹é©¬é©¬èèï¼æ²¡æå¨æ¯ä»æåçé»è¾ä¸å¯¹ç¨æ·çæ¯ä»ç¶æè¿è¡å¤æï¼å¯¼è´é»è¾ç¨æ·å
ä¸æ¬¡é±ï¼å¨æ°æ®åºå´éå¤æ§è¡äºå¥½å 次ç¸å
³æ°æ®åºæä½ãåè
åäºä»è´¹ç¨æ·ï¼åè
åäºä½ çå
¬å¸ï¼è¿éå¦æä¸æ³¨æçè¯ï¼åæåªä¼å¾ä¸¥éï¼æ¶åå°é±çå°æ¹è¦åå å°å¿ã
ï¼2ï¼.å¨åè°è·¯ç±æåçæ¹æ³å
ï¼å¦æä½ çæ¯ä»æåçé»è¾æåè¿è¡äºï¼éè¦return trueï¼å¦æ没ææåè¿è¡æ°æ®åºæä½ï¼éè¦è¿åfalseï¼æä¸è¿åï¼å¾®ä¿¡ä¼åä¸æ¬¡åéåè°ä¿¡æ¯ï¼postæ¹å¼ï¼ã
ä¸ãä¸äºeasywechatå®æ¹ç建议ï¼
è¿ééè¦æ³¨æçæå 个ç¹ï¼
1.handleNotify åªæ¥æ¶ä¸ä¸ª callable åæ°ï¼é常ç¨ä¸ä¸ªå¿åå½æ°å³å¯ã
2.该å¿åå½æ°æ¥æ¶ä¸¤ä¸ªåæ°ï¼è¿ä¸¤ä¸ªåæ°åå«ä¸ºï¼
$notify 为å°è£
äºéç¥ä¿¡æ¯ç EasyWeChat\Support\Collection 对象ï¼åé¢å·²ç»è®²è¿è¿éå°±ä¸èµè¿°äºï¼ä½ å¯ä»¥ä»¥å¯¹è±¡æè
æ°ç»å½¢å¼æ¥è¯»åéç¥å
容ï¼æ¯å¦ï¼$notify->totalfee æè
$notify['totalfee']ã
$successful è¿ä¸ªåæ°å
¶å®å°±æ¯å¤æ ç¨æ·æ¯å¦ä»æ¬¾æåäºï¼result_code == âSUCCESSâï¼
3.该å½æ°è¿åå¼å°±æ¯åè¯å¾®ä¿¡ âææ¯å¦å¤çå®æâï¼å¦æä½ è¿åä¸ä¸ª false æè
ä¸ä¸ªå
·ä½çé误æ¶æ¯ï¼é£ä¹å¾®ä¿¡ä¼å¨ç¨åå次继ç»éç¥ä½ ï¼ç´å°ä½ æç¡®çåè¯å®ï¼âæå·²ç»å¤çå®æäºâï¼å¨å½æ°é return true; 代表å¤çå®æã
4.handleNotify è¿åå¼ $response æ¯ä¸ä¸ª Response 对象ï¼å¦æä½ è¦ç´æ¥è¾åºï¼ä½¿ç¨ $response->send(), å¨ä¸äºæ¡æ¶éä¸æ¯è¾åºèæ¯è¿åï¼return $responseã
5.注æï¼è¯·æ âæ¯ä»æåä¸å¦â ä¸ âæ¯å¦å¤çå®æâ åå¼ï¼å®ä¿©æ²¡æå¿
ç¶å
³ç³»ã
æ¯å¦ï¼å¾®ä¿¡éç¥ä½ ç¨æ·æ¯ä»å®æï¼ä½æ¯æ¯ä»å¤±è´¥äº(result_code 为 âFAILâ)ï¼ä½ åºè¯¥æ´æ°ä½ ç订å为æ¯ä»å¤±è´¥ï¼ä½æ¯è¦åè¯å¾®ä¿¡å¤çå®æã
åè®°
1.å¨å¾®ä¿¡å¼åä¸ï¼å¤§éç¨å°äºlaravelèªå¸¦çLogæ¥éçæ¹æ³ï¼å½var_dump(),echo(),dd()çæ¹æ³ä¸è½æ¥çé误信æ¯æ¯ï¼ä½¿ç¨æ¥å¿æ¥éå°±å¯ä»¥è§£å³äºãææ ·ä½¿ç¨laravelçlogæå¡ï¼è¿ä¸ªä»¥åä¼è®²ã
2.æ¬é¡¹ç®å¼åå¯ä»¥è¯´æ¯ç»ä»¶åå¼åï¼æå¼åé度快ï¼ä»£ç è´¨éé«ï¼ç»´æ¤ææ¬ä½çä¼ç¹ï¼æ¬ä¾ç微信å¼åæ¯ä¸ä¸ªç¼©å½±ã
[åæå°å](
http://www.blog8090.com/)