软录 · 2023年4月19日

微信jsapi回调详解|微信支付 jsapi接口怎么调

1. 微信支付怎么配置jsapi

微信支付,是微信向有出售物品/提供服务需求的商家提供推广销售、支付收款、经营分析的整套解决方案,包括多种支付方式,如付款码支付、JSAPI支付、小程序支付、APP支付、电脑网站支付、企业微信支付、H5支付,以及多种支付工具,如微信红包、代金券等。微信支付配置步骤:步骤1:注册支付商户号步骤2、秘钥(32位)步骤3、上传证书步骤4、商户号新增小程序授权(注意授权状态是否是成功)步骤5、公众号支付、JSAPI开通登录小程序后台找到配置管理→支付配置登录开通微信支付商户平台(https://pay.weixin.qq.com),在微信支付商户平台里面进行查找商户号和设置API密钥、下载证书以下步骤查找上述基础的内容在哪个地方查找。步骤1、支付商户号查找:(注:登录商户号尽量使用360浏览器或者谷歌浏览器)进入后在 账户中心—商户信息、可以看到微信支付商户号、把商户号记一下,填到后台。注:首次进入微信支付后台需要下载控件和操作证书(按照提示一步步操作即可)步骤二:API密钥:随后点击下面的API安全、设置一下API秘钥,API密钥必须是32位字母或数字注:该处设置秘钥时看下设置下方的API秘钥,不要设置APIV3的秘钥。注:该处设置下后把新设置的密钥填到制作后台。步骤三:证书路径、密钥路径:API秘钥设置好了之后、点击下载API证书(注:该处证书上传用于退款。退款需要往商户号里充值钱。)下载后是一个压缩包,然后解压、然后根据名称分别上传到证书路径、密钥路径。步骤四:小程序在公众号里申请,公众号里开通的微信支付;该方式需要先登录商户号->产品中心->APPID授权管理->新增该小程序的授权。具体如下图:如提示已绑定(此步骤跳过)授权后到微信小程序后台同意授权。如图:确保上图申请单状态是授权成功。步骤五:查看微信支付商户号公众号支付、JSAPI是否开通。如下图:(如未开通,点击开通下,如果没有公众号支付可不用管)(1)公众号支付开通(如果没有公众号支付,此步骤跳过)(2)JSAPI开通

2. 微信的jsapi支付能整合到thinkphp吗

在demo文件夹中:js_api_call.php:提供了微信jsapi的主要功能log_.php:提供打印日志功能notify_url.php:异步通知功能notify_url.log:异步通知日志qrcode.js:生成二维码js插件接下来介绍下WxPayPubHelper文件夹下的文件:cacert 文件夹是存放微信证书的(PS:具体我还没怎么用证书,虽然下载下来了,证书请在微信商户平台上下载)SDKRuntimeException.php:这个就是处理异常的、WxPay.pub.config.php:这个是做一些配置的,稍后会详细讲解WxPayPubHelper.php:这个其实就是微信支付的工具类,对于初学者只要知道怎么用他里面的方法就够了OK,了解了微信官方提供的文件,我们就可以开始整合到TP中了,废话不多说,这就开始!step1:将demo中的WxPayPubHelper整个文件夹都复制到TP的Vendor目录下,像我这样:step2:配置WxPay.pub.config.php文件:这里的配置都有注释,如果还有不懂或者配置出现问题可以留言提问同时我把微信的这个配置放到了TP的config中,这一步大家可以随意<?phpreturn array( //'配置项'=>'配置值' define('WEB_HOST', '这是您的网站域名地址'), /*微信支付配置*/ 'WxPayConf_pub'=>array( 'APPID' => '您的APPID', 'MCHID' => '您的商户ID', 'KEY' => '商户秘钥', 'APPSECRET' => '您的APPSECRET', 'JS_API_CALL_URL' => WEB_HOST.'/index.php/Home/WxJsAPI/jsApiCall', 'SSLCERT_PATH' => WEB_HOST.'/ThinkPHP/Library/Vendor/WxPayPubHelper/cacert/apiclient_cert.pem', 'SSLKEY_PATH' => WEB_HOST.'/ThinkPHP/Library/Vendor/WxPayPubHelper/cacert/apiclient_key.pem', 'NOTIFY_URL' => WEB_HOST.'/index.php/Home/WxJsAPI/notify', 'CURL_TIMEOUT' => 30 ));复制代码step3:将生成二维码的js放在Public目录下(这里目前用不到,在用扫码支付的情况才用到这个js),将日志文件放在Public目录下:像我这样:step4:创建控制器:这里创建了一个WxJsAPIController的控制器,这里大家随便起名字,只要这个跟你们在公众平台上的设置相对应就可以(公众平台设置稍后介绍)下面是控制器的代码部分了,首先初始化控制器,将WxPayPubHelper导入/** * 初始化 */ public function _initialize() { //引入WxPayPubHelper vendor('WxPayPubHelper.WxPayPubHelper'); }复制代码接下来是使用统一支付接口,获取prepay_id的方法: public function jsApiCall() { //使用jsapi接口 $jsApi = new \JsApi_pub(); //=========步骤1:网页授权获取用户openid============ //通过code获得openid if (!isset($_GET['code'])) { //触发微信返回code码 $url = $jsApi->createOauthUrlForCode(C('WxPayConf_pub.JS_API_CALL_URL')); Header("Location: $url"); }else { //获取code码,以获取openid $code = $_GET['code']; $jsApi->setCode($code); $openid = $jsApi->getOpenId(); } //=========步骤2:使用统一支付接口,获取prepay_id============ //使用统一支付接口 $unifiedOrder = new \UnifiedOrder_pub(); //设置统一支付接口参数 //设置必填参数 //appid已填,商户无需重复填写 //mch_id已填,商户无需重复填写 //noncestr已填,商户无需重复填写 //spbill_create_ip已填,商户无需重复填写 //sign已填,商户无需重复填写 $unifiedOrder->setParameter("openid",$openid);//商品描述 $unifiedOrder->setParameter("body","贡献一分钱");//商品描述 //自定义订单号,此处仅作举例 $timeStamp = time(); $out_trade_no = C('WxPayConf_pub.APPID').$timeStamp; $unifiedOrder->setParameter("out_trade_no",$out_trade_no);//商户订单号 $unifiedOrder->setParameter("total_fee","1");//总金额 $unifiedOrder->setParameter("notify_url",C('WxPayConf_pub.NOTIFY_URL'));//通知地址 $unifiedOrder->setParameter("trade_type","JSAPI");//交易类型 //非必填参数,商户可根据实际情况选填 //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号 //$unifiedOrder->setParameter("device_info","XXXX");//设备号 //$unifiedOrder->setParameter("attach","XXXX");//附加数据 //$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间 //$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间 //$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记 //$unifiedOrder->setParameter("openid","XXXX");//用户标识 //$unifiedOrder->setParameter("proct_id","XXXX");//商品ID $prepay_id = $unifiedOrder->getPrepayId(); //=========步骤3:使用jsapi调起支付============ $jsApi->setPrepayId($prepay_id); $jsApiParameters = $jsApi->getParameters(); $this->assign('jsApiParameters',$jsApiParameters); $this->display('pay'); //echo $jsApiParameters; }复制代码这里都是复制微信demo的,改改名字罢了,没什么其他的接下来是异步通知方法,也是复制的微信demo上的 public function notify() { //使用通用通知接口 $notify = new \Notify_pub(); //存储微信的回调 $xml = $GLOBALS['HTTP_RAW_POST_DATA']; $notify->saveData($xml); //验证签名,并回应微信。 //对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败, //微信会通过一定的策略(如30分钟共8次)定期重新发起通知, //尽可能提高通知的成功率,但微信不保证通知最终能成功。 if($notify->checkSign() == FALSE){ $notify->setReturnParameter("return_code","FAIL");//返回状态码 $notify->setReturnParameter("return_msg","签名失败");//返回信息 }else{ $notify->setReturnParameter("return_code","SUCCESS");//设置返回码 } $returnXml = $notify->returnXml(); echo $returnXml; //==商户根据实际情况设置相应的处理流程,此处仅作举例======= //以log文件形式记录回调信息// $log_ = new Log_(); $log_name= __ROOT__."/Public/notify_url.log";//log文件路径 log_result($log_name,"【接收到的notify通知】:\n".$xml."\n"); if($notify->checkSign() == TRUE) { if ($notify->data["return_code"] == "FAIL") { //此处应该更新一下订单状态,商户自行增删操作 log_result($log_name,"【通信出错】:\n".$xml."\n"); } elseif($notify->data["result_code"] == "FAIL"){ //此处应该更新一下订单状态,商户自行增删操作 log_result($log_name,"【业务出错】:\n".$xml."\n"); } else{ //此处应该更新一下订单状态,商户自行增删操作 log_result($log_name,"【支付成功】:\n".$xml."\n"); } //商户自行增加处理流程, //例如:更新订单状态 //例如:数据库操作 //例如:推送支付完成信息 } }复制代码这里我把记录日志的类写到了function.php中:function log_result($file,$word){ $fp = fopen($file,"a"); flock($fp, LOCK_EX) ; fwrite($fp,"执行日期:".strftime("%Y-%m-%d-%H:%M:%S",time())."\n".$word."\n\n"); flock($fp, LOCK_UN); fclose($fp);}复制代码好了 其实控制器的方法就这么多,没什么其他的了,下面看一下页面,直接上代码吧:<!DOCTYPE html><html><head> <meta http-equiv="content-type" content="text/html;charset=utf-8"/> <title>微信安全支付</title> <script type="text/javascript"> //调用微信JS api 支付 function jsApiCall() { WeixinJSBridge.invoke( 'getBrandWCPayRequest', <?php echo $jsApiParameters; ?>, function(res){ WeixinJSBridge.log(res.err_msg); alert(res.err_code+res.err_desc+res.err_msg); //alert("{$jsApiParameters}"); } ); } function callpay() { if (typeof WeixinJSBridge == "undefined"){ if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady', jsApiCall, false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', jsApiCall); document.attachEvent('onWeixinJSBridgeReady', jsApiCall); } }else{ jsApiCall(); } } </script></head><body> </br></br></br></br> <div align="center"> <button style="width:210px; height:30px; background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" type="button" onclick="callpay()" >贡献一下</button> </div></body></html>复制代码无须改动什么,直接复制就好接下来是微信公众平台上的配置了,这里我遇到过问题,如果有在这里遇到问题的同学请留言,比如出现了access_deined或者access_notallowed等问题,这都可能是因为这里配置不对。

3. wap 微信支付,公众平台怎么配置,回调接口,谢谢管理

回调肯定是没了,jsapi用着坑太多:1. 只能服务号里跳转去支付,订阅号里支付会提示不能跨号支付,支付又成了专号专用的了,文档里没看到,结果最后发短信给用户,加微信群,然后发链接给支付2. 有的用户获取不到openid,空的3. 支付成功页面必须用户点击完成,关闭微信弹出成功提示页面,才有js通知支付状态4. 各种key有时效2小时,偏偏还有每天限量取的坑5. 我每天要跑程序去对比订单,查询订单是不是支付成功,让我的数据跟微信数据同步6. 订单号在微信公众号流水里查不到,要到商户后台去查,还不是财付通的商户后台7. 财付通的这里面的订单号还有好几个,财付通的我反正是不想碰。

4. 微信支付 jsapi接口怎么调

这个out_trade_no你请求来过去没,自 这个out_trade_no是你自己网站上的订单号,流程是这样的 用户在你的网站支付,你自己的网站首先生成一个订单号,比如1234,然后把相关的信息请求给微信,这个out_trade_no也就是你的订单号(1234)

5. jsapi微信支付 回调怎么写

各项设置应该都正常,因为支付已经ok了,在公众号后台能看到支付成功的流水。 调的js接口,只接内到了容js返回的get_brand_wcpay_request:ok,设置的回调通知地址毫无反应(用日志调试)。

6. jsapi支付什么意思

JSAPI支付是指用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块来完成支付。适用于在公众号、朋友圈、聊天窗口等微信内完成支付的场景。JSAPI支付的申请流程如下:1、注册微信公众号,公众号类型为服务号、政府或媒体订阅号。2、认证微信公众号,认证费用是每次300元,如果不进行认证是没法用微信支付的。3、登录微信的公众平台,点击左方菜单中的微信支付按钮,根据要求填写需要的资料,然后等待微信官方的审核,审核时间为48小时内。4、在审核通过后,微信官方会以邮件、公众号等方式发送给联系人开户信息,按照要求填写财付通备付金汇入的随机金额,即可完成账户验证。5、在给出线上的电子协议中进行签署,签署完毕后就可以进行交易和所得资金的结算,签署的文件时可以立即生效的。6、当签署完协议后,就可以获得支付接口,可以根据官方给出的开发文档中的内容进行开发,也可以根据成功的案例进行研发设计。本条内容来源于:中国法律出版社《法律生活常识全知道系列丛书》

7. php 微信支付jsapi怎么调用

问题出在网页端调起支付API接口中timeStamp参数,必须是string类型,但是php默认生成的内时间戳是int类型。解决方法就容是修改下 lib/Wxpay.Data.php约2731行处SetTimeStamp方法,修改为 $this->values['timeStamp'] = (string)$value; 即可

8. thinkphp微信支付回调是什么意思

支付回调就是 支付后微信系统发送结果的地址

9. 微信支付成功后,微信回调值是空的,怎么解决

function jsApiCall(){WeixinJSBridge.invoke('getBrandWCPayRequest',<?php echo $jsApiParameters;?>,function(res){WeixinJSBridge.log(res.err_msg);if(res.err_msg == "get_brand_wcpay_request:ok"){ //这个地方是判断支付成功!}});}