>  기사  >  위챗 애플릿  >  PHP를 통한 APP WeChat 결제 구현 사례 분석

PHP를 통한 APP WeChat 결제 구현 사례 분석

php中世界最好的语言
php中世界最好的语言원래의
2018-03-05 13:47:092081검색

요즘에는 APP WeChat 결제가 주류 결제 방식이 되었습니다. 아래에서는 PHP를 통한 APP WeChat 결제에 대한 설명을 소개합니다. 에디터와 함께 간단하고 쉽게 배워보세요.

1. PHP 백그라운드에서 선불 거래 주문을 생성하고 올바른 선불 거래 응답 ID를 반환한 다음 앱에서 결제를 호출합니다.

공식 문서:

https://pay.weixin .qq.com/wiki/doc/api/app/app.php?chapter=9_1

문서에 따르면 WeChat에서 요구하는 매개변수를 연결해야 합니다. 여기에는 여러 가지 방법이 필요합니다. 코드를 직접 입력하세요!

WeChat으로 전송되는 매개변수는 xml 형식으로 조합되어야 합니다(예: 매개변수 배열).

public function ToXml($data=array())
 {
 if(!is_array($data) || count($data) <= 0)
 {
  return &#39;数组异常&#39;;
 }
 $xml = "<xml>";
 foreach ($data as $key=>$val)
 {
  if (is_numeric($val)){
  $xml.="<".$key.">".$val."</".$key.">";
  }else{
  $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
  }
 }
 $xml.="</xml>";
 return $xml;
 }

2. WeChat에서 요구하는 매개변수인 임의의 문자열을 생성합니다. 여기에는 선호도에 따라 다릅니다! 3. 이것은 WeChat의 중요한 단계입니다. 이 방법은 여러 번 사용됩니다! 서명 생성

function rand_code(){
 $str = &#39;0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ&#39;;//62个字符
 $str = str_shuffle($str);
 $str = substr($str,0,32);
 return $str;
}

4. 매개변수를 WeChat에 전달하고 선불 주문을 생성합니다. WeChat에서 반환된 데이터를 받아 앱으로 다시 보냅니다. . 앱에서 결제 인터페이스를 호출하여 결제를 완료합니다. 앱의 필수 매개변수는 WeChat을 참조하세요. 문서: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter =9_12&index=2

private function getSign($params) {
 ksort($params); //将参数数组按照参数名ASCII码从小到大排序
 foreach ($params as $key => $item) {
  if (!empty($item)) {  //剔除参数值为空的参数
  $newArr[] = $key.&#39;=&#39;.$item; // 整合新的参数数组
  }
 }
 $stringA = implode("&", $newArr);  //使用 & 符号连接参数
 $stringSignTemp = $stringA."&key="."************************"; //拼接key
 // key是在商户平台API安全里自己设置的
 $stringSignTemp = MD5($stringSignTemp); //将字符串进行MD5加密
 $sign = strtoupper($stringSignTemp); //将所有字符转换为大写
 return $sign;
 }

5. WeChat에서 반환된 데이터를 받을 때 사용되는 배열로 변환합니다.

public function wx_pay() {
 $nonce_str = $this->rand_code(); //调用随机字符串生成方法获取随机字符串
 $data[&#39;appid&#39;] =&#39;wxdbc5dc*******&#39;; //appid
 $data[&#39;mch_id&#39;] = &#39;1493*****&#39; ; //商户号
 $data[&#39;body&#39;] = "APP支付测试";
 $data[&#39;spbill_create_ip&#39;] = $_SERVER[&#39;HTTP_HOST&#39;]; //ip地址
 $data[&#39;total_fee&#39;] = 1;    //金额
 $data[&#39;out_trade_no&#39;] = time().mt_rand(10000,99999); //商户订单号,不能重复
 $data[&#39;nonce_str&#39;] = $nonce_str;   //随机字符串
 $data[&#39;notify_url&#39;] = &#39;http://xxx.xxx.com/wx_notify&#39;; //回调地址,用户接收支付后的通知,必须为能直接访问的网址,不能跟参数
 $data[&#39;trade_type&#39;] = &#39;APP&#39;; //支付方式
 //将参与签名的数据保存到数组 注意:以上几个参数是追加到$data中的,$data中应该同时包含开发文档中要求必填的剔除sign以外的所有数据
 $data[&#39;sign&#39;] = $this->getSign($data); //获取签名
 $xml = $this->ToXml($data);  //数组转xml
 //curl 传递给微信方
 $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
 //header("Content-type:text/xml");
 $ch = curl_init();
 curl_setopt($ch,CURLOPT_URL, $url);
 if(stripos($url,"https://")!==FALSE){
  curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
 } else {
  curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
  curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
 }
 //设置header
 curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
 curl_setopt($ch, CURLOPT_HEADER, FALSE);
 //要求结果为字符串且输出到屏幕上
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
 //设置超时
 curl_setopt($ch, CURLOPT_TIMEOUT, 30);
 curl_setopt($ch, CURLOPT_POST, TRUE);
 //传输文件
 curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
 //运行curl
 $data = curl_exec($ch);
 //返回结果
 if($data){
  curl_close($ch);
  //返回成功,将xml数据转换为数组.
  $re = $this->FromXml($data);
  if($re[&#39;return_code&#39;] != &#39;SUCCESS&#39;){
  json("201",&#39;签名失败&#39;);
  }
  else{
  //接收微信返回的数据,传给APP!
  $arr =array(
   &#39;prepayid&#39; =>$re[&#39;prepay_id&#39;],
   &#39;appid&#39; => &#39;wxdbc5dc*****&#39;,
   &#39;partnerid&#39; => &#39;14937****&#39;,
   &#39;package&#39; => &#39;Sign=WXPay&#39;,
   &#39;noncestr&#39; => $nonce_str,
   &#39;timestamp&#39; =>time(),
  );
  //第二次生成签名
  $sign = $this->getSign($arr);
  $arr[&#39;sign&#39;] = $sign;
  json(&#39;200&#39;,&#39;签名成功&#39;,$arr);
  }
 } else {
  $error = curl_errno($ch);
  curl_close($ch);
  json(&#39;201&#39;,"curl出错,错误码:$error");
 }
 }

2. APP 결제가 성공하면 입력한 콜백 주소가 호출됩니다.

반환 매개변수에 대한 자세한 내용은 WeChat 설명서를 참조하세요: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3

public function FromXml($xml)
 {
 if(!$xml){
  echo "xml数据异常!";
 }
 //将XML转为array
 //禁止引用外部xml实体
 libxml_disable_entity_loader(true);
 $data = json_decode(json_encode(simplexml_load_string($xml, &#39;SimpleXMLElement&#39;, LIBXML_NOCDATA)), true);
 return $data;
 }
여기서 위챗 앱 결제가 성공적으로 완료되었습니다! 귀하의 지원에 감사드립니다!

위 내용은 PHP로 APP WeChat 결제를 구현하는 구체적인 방법입니다. 에디터의 예시 설명을 통해 다들 마스터하셨을 거라 믿습니다.

관련 추천 :

위챗 결제 알람 알림 예시

PHP 위챗 결제 개발 위챗 환불 기능 예시

위챗 결제 기능 통합에 대한 Thinkphp 상세 설명

위 내용은 PHP를 통한 APP WeChat 결제 구현 사례 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.