当前位置: 首页 > 后端技术 > PHP

PHP-Laravel支付宝支付和微信支付

时间:2023-03-29 17:56:26 PHP

支付宝注册首先需要注册两个平台账号,一个是支付宝商户平台,一个是支付宝开放平台,需要实名企业账号认证,免费。如果没有条件,可以使用支付宝模拟沙箱进行测试。在前端支付宝开放平台注册后,申请一个应用程序,得到一个APPID。比如我要开发一个网站支付,我会申请一个网页/手机应用程序应用。支付宝商户平台注册后,获取商户ID,然后将之前的APPID与商户ID进行绑定。3、支付宝开放平台设置的密钥有两种(即:应用私钥、应用公钥、支付宝公钥),一种是公钥方式,一种是证书方式,公钥密钥模式不需要上传证书。应用网关(用于接收支付宝异步通知信息)-回调地址(支付后回调,可以设置只验证域名)。下载SDK到官网下载SDK。支付宝SDK有两种,一种是普通版,一种是简易版。简单来说,通用版适合非框架,简易版适合框架。通用版:这里以Laravel为例,放在/app/alipay目录下(你可以随意更改到其他位置),然后在composer.autoload下的classmap中添加一行“app/alipay”。json加载SDK:"classmap":["app/alipay"]之后,在CMD中运行composerdump-autoload命令使用SDKcomposerdump-autoloadeasy版本:运行composer命令composerrequirealipaysdk/easysdk:^2.0配置信息在config目录下新建一个alipay.php,在里面配置信息(可以从之前的支付宝开放平台获取)"",//商户私钥,你原来的RSA私钥'merchant_private_key'=>"",//异步通知地址'notify_url'=>"http://工程公网访问地址/alipay.trade.wap.pay-PHP-UTF-8/notify_url.php",//同步跳转'return_url'=>"http://mitsein.com/alipay.trade.wap.pay-PHP-UTF-8/return_url.php",//编码格式'charset'=>"UTF-8",//签名方式'sign_type'=>"RSA2",//接口加密密钥(不设置也可以使用)'screct_key'=>'',//支付宝网关'gatewayUrl'=>"https://openapi.alipay.com/gateway.do",//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm对应APPID下的支付宝公钥。'alipay_public_key'=>"",//日志路径'log_path'=>"",];ps:沙箱环境和官方环境网关不同//支付宝官方环境网关'gatewayUrl'=>"https://openapi.alipay.com/gateway.do",//支付宝沙箱环境网关'gatewayUrl'=>"https://openapi.alipaydev.com/gateway.do",此处支付宝支付代码以网站支付为例,可参考通用版SDK文档$config=config("alipay");//商户订单号,商户网站订单系统中唯一的订单号,必填$out_trade_no=time().mt_rand(1111,9999);//订单名称,必填$subject=trim("Q币订单支付");//支付金额,必填$total_amount=499;//商品描述,可以为空$body="EDG皮肤礼包";//构造参数$payRequestBuilder=newAlipayTradePagePayContentBuilder();$payRequestBuilder->setBody($body);$payRequestBuilder->setSubject($subject);$payRequestBuilder->setTotalAmount($total_amount);$payRequestBuilder->setOutTradeNo($out_trade_no);$aop=newAlipayTradeService($config);/***pagePay电脑网站支付请求*@param$builder业务参数,使用buildmodel中的对象生成。*@param$return_url同步跳转地址,可公网访问*@param$notify_url异步通知地址,可公网访问*[[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554)$response支付宝返回的信息*/return$aop->pagePay($payRequestBuilder,$config['return_url'],$config['notify_url']);简易版//1.设置参数(全局只需要设置一次)$config=config('alipay');$options=新配置();$options->protocol='https';$options->gatewayHost='openapi.alipay.com';$options->signType='RSA2';$options->appId=$config['app_id'];//为了避免私钥随源码泄露,建议从文件中读取私钥字符串,而不是在源码中写入$options->merchantPrivateKey=$config['merchant_private_key'];$options->gatewayHost="openapi.alipaydev.com";$options->alipayPublicKey=$config['alipay_public_key'];//可以设置异步通知接收服务地址(可选)$options->notifyUrl=$config['notify_url'];//可以设置AES密钥,调用AES加解密相关接口时需要(可选)//$options->encryptKey=$配置['screct_key'];工厂::设置选项($选项);尝试{//2。发起API调用(以支付能力下统一收单交易创建接口为例)$result=Factory::payment()->page()->pay("iPhone616G","2020423435526001","88.88",$config['return_url']);返回$result->正文;}catch(Exception$e){echo"调用失败,".$e->getMessage().PHP_EOL;;}其他的调用方式可以在alipaysdk中的API文档中找到调用,比如手机网站H5支付:$result=Factory::payment()->wap()->pay("Q币充值标题","订单number",88.88,"支付失败跳转URL","支付成功同步跳转URL");返回$result->正文;支付成功后会跳转到之前配置的同步GET跳转URL,然后支付宝会向异步通知URL发送POST请求$params=$request->all();echo'购买成功!';无需支付回调,防止数据泄露被恶意调用。支付宝签名验证需要将所有参数拼接成一个字符串签名验证,所以不要带入多余的参数。通用版本$params=$request->all();$config=config("支付宝");$aop=newAlipayTradeService($config);$config=config("支付宝");//记得去掉多余的参数paramsif($aop->check($params)){echo'签名验证成功';}简易版$config=config('alipay');$params=$request->all();$Signer=newSigner();//记得去掉多余的参数params$v=$Signer->verifyParams($params,$config['alipay_public_key']);if($v){echo'签名验证成功';}微信注册注册微信开放平台和微商平台。微信商户需要微信认证(支付300元)。注册完成后,获取信息并下载SDK。这里我们直接使用easywechat工具进行开发。由于我们使用的是Laravel,所以可以下载easywechat的laravel版本。Composer需要“overtrue/laravel-wechat:~5.0”配置文件运行命令phpartisanvendor:publish--provider="Overtrue\LaravelWeChat\ServiceProvider"会在config目录下生成wechat.php修改wechat.php/**WeChatpayment*/'payment'=>['default'=>['sandbox'=>env('WECHAT_PAYMENT_SANDBOX',false),'app_id'=>env('WECHAT_PAYMENT_APPID','yourappid'),'mch_id'=>env('WECHAT_PAYMENT_MCH_ID','您的商家ID'),'key'=>env('WECHAT_PAYMENT_KEY','您的密钥'),'cert_path'=>env('WECHAT_PAYMENT_CERT_PATH','/cert/apiclient_cert.pem'),//XXX:绝对路径!!!!'key_path'=>env('WECHAT_PAYMENT_KEY_PATH','/cert/apiclient_key.pem'),//XXX:绝对路径!!!!'notify_url'=>'http://www.baidu.com',//默认支付结果通知地址],//...],支付码类型注意amount字段total_fee应该是*100,比如1元写100,trade_type类型是支付方式,以及其他方式有:JSAPI--JSAPI支付(或小程序支付),NATIVE--原生支付,APP--应用支付,MWEB--H5支付,不同的trade_type决定支付方式,请正确上传扫码支付$config根据支付product=config('wechat.payment.default');$app=Factory::payment($config);$result=$app->order->unify(['body'=>'Q币微信支付','out_trade_no'=>随机生成的订单号,'total_fee'=>1*100,'trade_type'=>'NATIVE',//请替换为您支付方式对应的值类型]);$result['总计']=$data['总计'];返回$结果;这里我使用的是原生支付,会返回一个二维码。SDK没有内置二维码生成库。使用您熟悉的工具创建二维码。可以,比如PHP部分有以下工具可以选择https://github.com/endroid/qr...https://github.com/SimpleSoft...https://github.com/aferrandin。..H5支付$config=config('wechat.payment.default');$app=Factory::payment($config);$result=$app->order->unify(['body'=>'Q币微信支付','out_trade_no'=>随机生成的订单号,'total_fee'=>1*100,'trade_type'=>'MWEB',//请替换为您支付方式对应的值类型]);$result['总计']=$data['总计'];返回重定向($result['mweb_url']);这是非微信浏览器下的H5支付,如果要在微信内浏览器下进行H5支付,需要使用JSSDK支付JSSDK支付先申请公众号,然后配置公众号信息/**公众号*/'official_account'=>['default'=>['app_id'=>env('WECHAT_OFFICIAL_ACCOUNT_APPID','你的AppID'),//AppID'secret'=>env('WECHAT_OFFICIAL_ACCOUNT_SECRET','你的秘密'),//AppSecret'token'=>env('WECHAT_OFFICIAL_ACCOUNT_TOKEN','yourtoken'),//Token'aes_key'=>env('WECHAT_OFFICIAL_ACCOUNT_AES_KEY','youraesencryptionkey')]]使用接口获取openid.这里使用easywechat封装的user()方法获取openid,先通过authorize接口获取code,再通过code获取openid,然后考虑将openid存放在session中,或者数据库等其他地方.if($request->has('code')){$config=config('wechat.official_account.default');$c=\EasyWeChat\Factory::officialAccount($config);$rs=$c->oauth->user();returnredirect("Yourorderpage?openid=".$rs['original']['openid']);}//获取代码$currentUrl=urlencode(url()->current());$url="https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxe96b27ac2a780cb1&redirect_uri={$currentUrl}&response_type=code&scope=snsapi_base&state=STATE&connect_redirect=1#wechat_redirect";returnredirect($url);使用前面获取到的openid下单,然后就是三种js支付方式:WeixinJSBridge、JSSDK、小程序$config=config('wechat.payment.default');$app=\EasyWeChat\Factory::payment($config);$result=$app->order->unify(['body'=>'Q币订单微信支付','out_trade_no'=>随机生成订单号,'total_fee'=>1*100,'trade_type'=>'JSAPI',//请替换为你支付方式对应的值类型'openid'=>$openid,]);//未完待续WeixinJSBridgePHP$json=$jssdk->桥Config($prepayId);//返回一个json字符串,如果要返回数组,传第二个参数falseJavaScriptWeixinJSBridge.invoke('getBrandWCPayRequest',$json,function(res){if(res.err_msg=="get_brand_wcpay_request:ok"){//使用以上方法判断前端返回,微信团队郑重提醒://res.err_msg会在用户支付成功后返回//ok,但不保证绝对可靠}});JSSDKPHP$config=$jssdk->sdkConfig($prepayId);//返回数组JavaScriptwx.chooseWXPay({timestamp:,nonceStr:'',package:'',signType:'',paySign:'',//支付签名成功:function(res){//支付成功后的回调函数}});小程序PHP$config=$jssdk->bridgeConfig($prepayId,false);//返回数组JavaScriptwx.requestPayment({timeStamp:,//注意timeStamp的格式nonceStr:'',package:'',signType:'',paySign:'',//支付签名成功:function(res){//支付成功后的回调函数}});支付回调微信支付成功后会有支付回调,这里返回的是xml,需要解析使用$xml=$request->getContent();$param=(array)simplexml_load_string($xml,'简单XMLElement',LIBXML_NOCDATA);echo'Q币充值成功';