찾다
위챗 애플릿위챗 개발ThinkPHP는 WeChat 결제(jsapi 결제)를 구현합니다.

이 글은 ThinkPHP로 WeChat 결제(jsapi 결제)를 구현하는 방법에 대한 자세한 튜토리얼을 주로 소개하고 있으니 필요하신 분들은 참고하시면 됩니다.

PHP로 WeChat 결제(jsapi 결제)를 구현하는 과정에 대해서는 이전에 글을 쓴 적이 있습니다. 자세한 내용은 PHP WeChat 결제(jsapi 결제) 프로세스 구현 문서를 참조하세요.

당시 환경은 프레임워크를 사용하지 않았는데, 도메인 이름이 가리키는 디렉터리 아래에 직접 새 디렉터리를 생성한 후 해당 디렉터리에 접근하는 방식으로 구현되었습니다. 그러나 프레임워크에 적용할 때 여전히 몇 가지 문제가 있었습니다. ThinkPHP에서는 라우팅 규칙과 결제 승인 디렉토리로 인해 불일치가 있어 오류가 보고됩니다. 이 기사에서는 TP에 WeChat 결제를 통합하는 과정에 대해 설명합니다.

구스팩토리에서 제작한 SDK와 문서는 이해하기 어렵고 직접 사용해보시면 얼마나 신선할지 아실 겁니다. 문서와 SDK는 최대한 간단하고 이해하기 쉬워야 하지 않나요? 활발한 재구성만이 구스팩토리 프로그래머들의 뛰어난 기술력을 보여줄 수 있는 것일까요? 음... 루키 속성을 노출했나... 사실 SDK는 사용하기는 꽤 쉬운데, 이전 글에서 본 것처럼 결제 완료 콜백 기능이 정말 헷갈립니다.

공식에서 우회하고 싶지 않고 TP에서 WeChat 결제를 사용하려는 분들을 위해 공식 문서를 기반으로 마스터가 재구성하고 간소화한 TP에 적합한 결제 SDK를 살펴볼 수 있습니다. 소스코드를 다운받아서 살펴보니 코드가 작성되어 있습니다. 소개가 매우 우아하고 과정도 간단하고 이해하기 쉽습니다. 자세한 내용은 블로그 게시물을 참조하세요: http://baijunyao.com/article/78

아직도 눈살을 찌푸리고 공식 SDK를 사용하여 성공적으로 결제를 구현했습니다.

1.SDK 다운로드 그리고 수정

이에 대해 너무 자세히 설명하지는 않겠습니다. 모르신다면 제 마지막 기사를 읽어보세요. PHP는 다운로드한 파일을 수정해야 하는 세부 사항을 설명하는 WeChat 결제(jsapi 결제) 프로세스를 구현합니다. .

2. 공식 계정 설정

A. 여전히 웹페이지 인증 도메인 이름을 설정해야 합니다. 이것은 특별한 것이 아닙니다.

B 여기에서 결제 인증 디렉토리를 주의하세요. REWRITE 모드를 사용하거나 REWRITE 모드를 사용하는 동안 의사 정적 모드를 사용하세요. 이때 생성되는 링크는 다음과 같습니다. http://serverName/Home/Blog/read/id/1

PATHINFO 모드를 사용하는 경우 생성합니다. 링크는 http://serverName/index.php/Home/Blog/read/id/1입니다. 예를 들어 홈 모듈 아래 블로그 컨트롤러의 메소드를 통해 결제하는 경우 결제에 대한 인증 디렉터리는 http여야 합니다. : //serverName/Home/Blog/ 또는 http://serverName/index.php/Home/Blog/, 이는 귀하의 TP에서 설정한 URL 패턴에 따라 다릅니다.

3. 결제 프로세스

(1) 통합 주문

주문의 결제 매개변수 구성은 기본적으로 이전과 동일합니다. 중요한 점은 결제 콜백 확인 링크가 필요하기 때문입니다. 여러 번 호출하여 매개변수 구성을 Application/Common/Common/function.php에 직접 캡슐화했습니다. 제 SDK는 프로젝트 루트 디렉터리 아래 Api 디렉터리에 있으므로 SDK 도입 시 Vendor 기능을 사용하지 않습니다.

/** 
 * 微信支付 
 * @param string $openId  openid 
 * @param string $goods  商品名称 
 * @param string $attach  附加参数,我们可以选择传递一个参数,比如订单ID 
 * @param string $order_sn 订单号 
 * @param string $total_fee 金额 
 */ 
function wxpay($openId,$goods,$order_sn,$total_fee,$attach){ 
 require_once APP_ROOT."/Api/wxpay/lib/WxPay.Api.php"; 
 require_once APP_ROOT."/Api/wxpay/payment/WxPay.JsApiPay.php"; 
 require_once APP_ROOT.'/Api/wxpay/payment/log.php'; 
 //初始化日志 
 $logHandler= new CLogFileHandler(APP_ROOT."/Api/wxpay/logs/".date('Y-m-d').'.log'); 
 $log = Log::Init($logHandler, 15); 
 $tools = new JsApiPay(); 
 if(empty($openId)) $openId = $tools->GetOpenid(); 
 $input = new WxPayUnifiedOrder(); 
 $input->SetBody($goods);     //商品名称 
 $input->SetAttach($attach);     //附加参数,可填可不填,填写的话,里边字符串不能出现空格 
 $input->SetOut_trade_no($order_sn);   //订单号 
 $input->SetTotal_fee($total_fee);   //支付金额,单位:分 
 $input->SetTime_start(date("YmdHis"));  //支付发起时间 
 $input->SetTime_expire(date("YmdHis", time() + 600));//支付超时 
 $input->SetGoods_tag("test3"); 
 //$input->SetNotify_url("http://".$_SERVER['HTTP_HOST']."/payment.php"); //支付回调验证地址 
 $input->SetNotify_url("http://".$_SERVER['HTTP_HOST']."/payment.php/WexinApi/WeixinPay/notify"); 
 $input->SetTrade_type("JSAPI");    //支付类型 
 $input->SetOpenid($openId);     //用户openID 
 $order = WxPayApi::unifiedOrder($input); //统一下单 
 $jsApiParameters = $tools->GetJsApiParameters($order); 
 return $jsApiParameters; 
}

주의, 주의, 여기 칠판의 핵심 사항이 있습니다:

결제 콜백 확인 링크는 허가 없이 확인되어야 하며 해당 링크에 직접 접속하여 확인을 위해 로그인하고 등록해야 하는 경우에는 시도하지 마세요. . 액세스 가능한 링크여야 하며 일련의 매개변수를 전달하지 마세요.

가장 좋은 점은 간단하고 조잡한 http://serverName/xxx.php입니다. index.php와 유사하게 다음 디렉토리에 결제 콜백을 위한 특수 항목 파일인 Payment.php를 다시 작성했습니다. Application/ 디렉토리의 WexinApi), 컨트롤러(WeixinPay) 및 메소드(notify):

// 检测PHP环境 
if(version_compare(PHP_VERSION,&#39;5.3.0&#39;,&#39;<&#39;)) die(&#39;require PHP > 5.3.0 !&#39;); 
// $_GET[&#39;m&#39;]=&#39;Admin&#39;; 
// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false 
define(&#39;APP_DEBUG&#39;,True); 
//指定模块控制器和方法 
$_GET[&#39;m&#39;]=&#39;WexinApi&#39;; 
$_GET[&#39;c&#39;]=&#39;WeixinPay&#39;; 
$_GET[&#39;a&#39;]=&#39;notify&#39;; 
// 定义应用目录 
define(&#39;APP_PATH&#39;,&#39;./Application/&#39;); 
define("APP_ROOT",dirname(__FILE__)); 
// 引入ThinkPHP入口文件 
require &#39;./ThinkCore/ThinkCore.php&#39;; 
// 亲^_^ 后面不需要任何代码了 就是如此简单

이제 http://serverName/pay.php를 방문하면 http://serverName/pay를 직접 입력하게 됩니다. /notify이므로 콜백 확인 링크를 http://serverName/pay.php 또는 http://serverName/결제.php/WexinApi/WeixinPay/notify로 작성할 수 있습니다.

(2) 결제 시작

은 여전히 ​​매우 간단합니다.

/** 
* 支付测试 
* 微信访问:http://daoshi.sdxiaochengxu.com/payment.php/WexinApi/WeixinPay/pay 
*/ 
public function pay(){ 
 $order_sn = getrand_num(true); 
 $openId = &#39;&#39;; 
 $jsApiParameters = wxpay($openId,&#39;江南极客&#39;,$order_sn,1); 
 $this->assign(array( 
  &#39;data&#39; => $jsApiParameters 
 )); 
 $this->display(); 
} 

<html> 
<head> 
 <meta http-equiv="content-type" content="text/html;charset=utf-8"/> 
 <meta name="viewport" content="width=device-width, initial-scale=1"/> 
 <title>小尤支付测试</title> 
 <script type="text/javascript"> 
 //调用微信JS api 支付 
 function jsApiCall() 
 { 
  var data={$data}; 
  WeixinJSBridge.invoke( 
   &#39;getBrandWCPayRequest&#39;, data, 
   function(res){ 
    WeixinJSBridge.log(res.err_msg); 
    //alert(&#39;err_code:&#39;+res.err_code+&#39;err_desc:&#39;+res.err_desc+&#39;err_msg:&#39;+res.err_msg); 
    //alert(res.err_code+res.err_desc+res.err_msg); 
    //alert(res); 
    if(res.err_msg == "get_brand_wcpay_request:ok"){ 
     alert("支付成功!"); 
     window.location.href="http://m.blog.csdn.net/article/details?id=72765676" rel="external nofollow" ; 
    }else if(res.err_msg == "get_brand_wcpay_request:cancel"){ 
     alert("用户取消支付!"); 
    }else{ 
     alert("支付失败!"); 
    } 
   } 
  ); 
 } 
 function callpay() 
 { 
  if (typeof WeixinJSBridge == "undefined"){ 
   if( document.addEventListener ){ 
    document.addEventListener(&#39;WeixinJSBridgeReady&#39;, jsApiCall, false); 
   }else if (document.attachEvent){ 
    document.attachEvent(&#39;WeixinJSBridgeReady&#39;, jsApiCall); 
    document.attachEvent(&#39;onWeixinJSBridgeReady&#39;, jsApiCall); 
   } 
  }else{ 
   jsApiCall(); 
  } 
 } 
 </script> 
</head> 
<body> 
 <br/> 
 <font color="#9ACD32"><b>该笔订单支付金额为<span style="color:#f00;font-size:50px">1分</span>钱</b></font><br/><br/> 
 <font color="#9ACD32"><b><span style="color:#f00;font-size:50px;margin-left:40%;">1分</span>钱也是爱</b></font><br/><br/> 
 <p align="center"> 
  <button style="width:210px; height:50px; border-radius: 15px;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" type="button" onclick="callpay()" >果断买买买^_^</button> 
 </p> 
</body> 
</html>

하지만 결제 페이지의 URL에는 많은 매개변수가 있어야 하기 때문에 결제 페이지의 URL에 주의해야 합니다. 방금 에서 사용된 REWRITE 모드를 언급했습니다. TP, 귀하의 링크는 [ http://serverName/Home/Blog/read/id/1 ]와 유사하며 더 많은 매개변수가 있을 수 있습니다. 이때 WeChat Pay는 귀하의 결제 승인 디렉토리가 [ http:/ /serverName/Home/ Blog/read/id/ ], 실제 인증된 디렉터리는 [ http://serverName/Home/Blog/]이므로 오류가 보고됩니다. 해결 방법은 결제 페이지 진입 시 URL을 재구성해서 일반 모드로 작성하는 것, 즉 [http://serverName/Home/Blog/read?id=1] 이면 됩니다.

(3) 성공 콜백 지원

이제 결제가 완료되었으니 앞서 작성한 링크에 해당하는 메소드인 [ http://serverName/paid.php/WexinApi/WeixinPay/notify ]를 입력하시면 됩니다. ]:

//微信支付回调验证 
public function notify(){ 
 $xml = $GLOBALS[&#39;HTTP_RAW_POST_DATA&#39;]; 
 // 这句file_put_contents是用来查看服务器返回的XML数据 测试完可以删除了 
 file_put_contents(&#39;./Api/wxpay/logs/log.txt&#39;,$xml,FILE_APPEND); 
 //将服务器返回的XML数据转化为数组 
 //$data = json_decode(json_encode(simplexml_load_string($xml,&#39;SimpleXMLElement&#39;,LIBXML_NOCDATA)),true); 
 $data = xmlToArray($xml); 
 // 保存微信服务器返回的签名sign 
 $data_sign = $data[&#39;sign&#39;]; 
 // sign不参与签名算法 
 unset($data[&#39;sign&#39;]); 
 $sign = $this->makeSign($data); 
 // 判断签名是否正确 判断支付状态 
 if ( ($sign===$data_sign) && ($data[&#39;return_code&#39;]==&#39;SUCCESS&#39;) && ($data[&#39;result_code&#39;]==&#39;SUCCESS&#39;) ) { 
  $result = $data; 
  // 这句file_put_contents是用来查看服务器返回的XML数据 测试完可以删除了 
  file_put_contents(&#39;./Api/wxpay/logs/log1.txt&#39;,$xml,FILE_APPEND); 
  //获取服务器返回的数据 
  $order_sn = $data[&#39;out_trade_no&#39;]; //订单单号 
  $order_id = $data[&#39;attach&#39;];  //附加参数,选择传递订单ID 
  $openid = $data[&#39;openid&#39;];   //付款人openID 
  $total_fee = $data[&#39;total_fee&#39;]; //付款金额 
  //更新数据库 
  $this->updateDB($order_id,$order_sn,$openid,$total_fee); 
 }else{ 
  $result = false; 
 } 
 // 返回状态给微信服务器 
 if ($result) { 
  $str=&#39;<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>&#39;; 
 }else{ 
  $str=&#39;<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>&#39;; 
 } 
 echo $str; 
 return $result; 
}

보안상의 이유로 반환된 서명을 다시 확인해야 합니다.

/** 
* 生成签名 
* @return 签名,本函数不覆盖sign成员变量 
*/ 
protected function makeSign($data){ 
 //获取微信支付秘钥 
 require_once APP_ROOT."/Api/wxpay/lib/WxPay.Api.php"; 
 $key = \WxPayConfig::KEY; 
 // 去空 
 $data=array_filter($data); 
 //签名步骤一:按字典序排序参数 
 ksort($data); 
 $string_a=http_build_query($data); 
 $string_a=urldecode($string_a); 
 //签名步骤二:在string后加入KEY 
 //$config=$this->config; 
 $string_sign_temp=$string_a."&key=".$key; 
 //签名步骤三:MD5加密 
 $sign = md5($string_sign_temp); 
 // 签名步骤四:所有字符转为大写 
 $result=strtoupper($sign); 
 return $result; 
}

至此,TP中微信支付也就搞定了。这是集成了官方的SDK实现的,如果不使用SDK,可以使用更简单的方法,见:PHP实现微信支付(jsapi支付)和退款(无需集成支付SDK)

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

php服务端集成支付宝APP支付

基于thinkPHP实现的微信自定义分享功能


위 내용은 ThinkPHP는 WeChat 결제(jsapi 결제)를 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
百度地图打车如何支付   打车的付款步骤介绍百度地图打车如何支付 打车的付款步骤介绍Mar 13, 2024 am 10:04 AM

  百度地图APP现在已经都成为了超多用户们首选的出行导航的软件,那么这里的一些功能全面,都能够免费的让大家进行选择操作哦,解决自己日常出行方面会遇到的一些问题,完全都能够查询到自己的一些出行的路线,规划自己的一些出行的方案,查询完对应的这一些路线,都能根据自己的需求,选择合适的一些出行方式,那么你们不管是选择一些公共交通,骑行,步行或者是打车等,都能满足你们的,有着对应的一些导航路线,成功的带领你们去往某地,那么大家选择打车的话,都能感到更加的方便,超多的一些司机们都是会在线接单,打车变得超级

uniapp应用如何实现支付和订单管理uniapp应用如何实现支付和订单管理Oct 19, 2023 am 10:37 AM

uniapp是一个跨平台的应用开发框架,可以同时开发小程序、App和H5。在uniapp应用中,实现支付和订单管理是非常常见的需求。本文将介绍如何在uniapp应用中实现支付功能和订单管理,并给出具体的代码示例。一、实现支付功能支付功能是实现在线交易的关键,通常需要集成第三方支付平台的SDK。以下是uniapp中实现支付功能的具体步骤:注册并获取第三方支付平

使用PHP和PayPal API进行支付使用PHP和PayPal API进行支付Jun 19, 2023 pm 04:13 PM

随着网络交易的日益普及,支付方式也在逐渐多样化,其中PayPal作为一种广泛使用的支付方法备受欢迎。如果您想在您的网站或应用程序上使用PayPal来处理交易,那么您可以使用PHP和PayPalAPI来轻松地完成支付过程。PayPalAPI是一组编程接口,用于与PayPal进行交互。通过API,您可以接收来自PayPal的通知、查询最新的交易信息、发起付款

paynow支付是什么意思paynow支付是什么意思Sep 30, 2022 am 11:01 AM

PayNow支付是一种电子转账类服务,用户能够通过收款方指定的手机号码、身份证/FIN号、UEN号或PayNow二维码,直接向该收款方发起实时新币转账,而无须对方银行账号信息。

武汉坐公交车用什么支付武汉坐公交车用什么支付Oct 13, 2022 pm 02:17 PM

武汉坐公交车的支付方式:1、现金支付,需要提前准备好足额的零钱,直接把钱投入投币口即可;2、武汉通刷卡,武汉通全称武汉城市一卡通,是一种集成电路卡,也称为芯片卡;3、支付宝电子公交卡,在支付宝内先领取一张武汉电子公交卡,然后上车时直接扫描二维码扣款上车即可;4、微信乘车码支付,打开微信“乘车码”小程序,开通武汉“乘车码”就可以直接扫描二维码扣款上车。

美团外卖极速支付怎么关闭美团外卖极速支付怎么关闭Mar 27, 2024 am 10:41 AM

在快节奏的现代生活中,美团外卖以其便捷的服务和丰富的选择,深受广大消费者的喜爱。其中,极速支付功能更是为用户带来了极大的便利,一键即可完成支付,省去了繁琐的输入步骤。不过很多用户并不喜欢不经确认直接付款,所以想要关闭这一功能。那么究竟该如何关闭美团外卖的极速支付呢?在下文中本站小编就将为大家带来详细的步骤设置教程,希望能帮助到大家!1.在手机桌面点击“美团外卖”快捷方式图标。2.登录手机美团外卖app,点击右下角“我的”。3.在我的界面,点击“进入钱包”。4.在美团钱包界面,点击右上角“设置”图

美团立减金在哪开启支付时默认抵扣_美团立减金开启支付时默认抵扣教程美团立减金在哪开启支付时默认抵扣_美团立减金开启支付时默认抵扣教程Mar 28, 2024 am 11:00 AM

1、首先打开【美团】APP,在底部导航栏内,点击【我的】按钮。2、接着点击【我的钱包】功能按钮,点击【现金券】按钮。3、随后在顶部功能栏内,点【立减金】按钮,点击开启【支付时默认抵扣】的开关按钮,即可开启成功。

建立MySQL中买菜系统的订单支付表建立MySQL中买菜系统的订单支付表Nov 01, 2023 pm 03:48 PM

建立MySQL中买菜系统的订单支付表,需要具体代码示例随着互联网的发展,购物已经变得越来越方便。在购物的过程中,订单支付是购物过程中的重要环节。买菜系统不仅需要有订单生成功能,还必须拥有完整的支付流程,因为支付成功才能算是完成一单交易。本文将讲述如何建立MySQL中买菜系统的订单支付表,并提供具体的代码示例。一、订单支付表设计买菜系统中订单支付表存储的是订单

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기