English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Desarrollo de la función de pago WeChat APP en PHP

Un poco de experiencia personal en el desarrollo del pago de WeChat en el extremo APP con PHP

Recientemente, debido a la necesidad de la empresa, se desarrolló el pago de WeChat en el extremo APP, vi la documentación de WeChat, se siente bastante bien, no encontré demasiados agujeros, los puntos que hay que prestar atención no son muchos.

Escribir un documento de notas, como recordatorio.

Flujo de pago APP

A partir de la imagen superior, se puede ver que el proceso que hay que prestar atención es en total3partes;
La primera parte: llamar al API de pedido, devolver el pedido de pago anticipado, firmar y luego devolver la información (4、5、6、7)
La segunda parte: notificación asincrónica (15、16)
La tercera parte: la última decisión del resultado del pago
Lo más importante que hay que prestar atención es la primera parte: llamar al API de pedido, devolver el pedido de pago anticipado, firmar y luego devolver la información

Documentación de WeChatHay una descripción detallada, aquí no se repetirá.

Adjunto mi código, please, con algunos cambios en el código se puede usar.

//Función de entrada
function weChatPay(){
   $json = array();
   //Parámetros obligatorios para generar el pedido de pago anticipado:
   $newPara = array();
   //ID de aplicación
   $newPara["appid"] = "wx2421b1c4370ec43"b";
   //Número del comerciante
   $newPara["mch_id"] = "10000100";
   //Número del dispositivo
   $newPara["device_info"] = "WEB";
   //Cadena de caracteres aleatoria, se recomienda usar la función para generar
   $newPara["nonce_str"] = "1add1a30ac87aa2db72f57a2375d8fec"
   //Descripción del producto
   $newPara["body"] = "APP pago de prueba";
   //Número de pedido del comerciante, aquí es el número de pedido interno del comerciante
   $newPara["out_trade_no"] = "1415659990";
   //Monto total
   $newPara["total_fee"] = 1;
   //IP del terminal
   $newPara["spbill_create_ip"] = $_SERVER["REMOTE_ADDR"];
   //Dirección de notificación, atención, no se deben agregar parámetros a la url aquí
   $newPara["notify_url"] = "http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php";
   //Tipo de transacción
   $newPara["trade_type"] = "APP";
   //Primera firma
   $newPara["sign"] = produceWeChatSign($newPara);
   //Convertir el array en formato xml
   $xmlData = getWeChatXML($newPara);
   //Utilizar el paquete CURL de PHP para transmitir los datos al interfaz de pedido unificado de WeChat, devolviendo un prepay_id normal
   $get_data = sendPrePayCurl($xmlData);
   //Realizar una evaluación del resultado devuelto.
   if($get_data['return_code'] == "SUCCESS" && $get_data['result_code'] == "SUCCESS"){
    //Realizar una firma en segunda instancia basada en el resultado devuelto por el pago de WeChat
    //Cadena de caracteres aleatoria necesaria para la firma en segunda instancia
    $newPara["nonce_str"] = "5K8264ILTKCH16CQ2502SI8ZNMTM67VS";
    //Timestamp necesario para la firma en segunda instancia
    $newPara['timeStamp'] = time()."";
    //Añadiendo parámetros restantes para la firma en segunda instancia
    $secondSignArray = array(
     "appid"=>$newPara['appid'],
     "noncestr"=>$newPara['nonce_str'],
     "package"=>"Sign=WXPay",
     "prepayid"=>$get_data['prepay_id'],
     "partnerid"=>$newPara['mch_id'],
     "timestamp"=>$newPara['timeStamp'],
    );
    $json['datas'] = $secondSignArray;
    $json['ordersn'] = $newPara["out_trade_no"];
    $json['datas']['sign'] = weChatSecondSign($newPara,$get_data['prepay_id']);
    $json['message'] = "La prepagación se ha completado";
    //La prepagación se ha completado, en el siguiente paso se realiza la lógica de negocio interna
    /*****************************/
    return json_encode($json);
   }
   else{
    $json['message'] = $get_data['return_msg'];
   }
  }
  return json_encode($json);
 }
//Primera función de firma produceWeChatSign
function produceWeChatSign($newPara){
  $stringA = self::getSignContent($newPara);
  $stringSignTemp=$stringA."&key="192006250b4c09247ec02edce69f6a2d";
  return strtoupper(MD5($stringSignTemp));
 }
//function to generate xml format
 public static function getWeChatXML($newPara){
  $xmlData = "<xml>";
  foreach ($newPara as $key => $value) {
   $xmlData = $xmlData."<".$key.">".$value."</".$key.">";
  }
  $xmlData = $xmlData."</xml>";
  return $xmlData;
 }
//function to send data to WeChat interface via curl
function sendPrePayCurl($xmlData) {
  $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
  $header[] = "Content-type: text/xml";
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
  curl_setopt($curl, CURLOPT_URL, $url);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($curl, CURLOPT_POST, 1);
  curl_setopt($curl, CURLOPT_POSTFIELDS, $xmlData);
  $data = curl_exec($curl);
  if (curl_errno($curl)) {
   print curl_error($curl);
  }
  curl_close($curl);
  return self::XMLDataParse($data);
 }
//xml format data parsing function
 public static function XMLDataParse($data){
  $msg = array();
  $msg = (array)simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA);
  return $msg;
 }
//Función de firma secundaria
function weChatSecondSign($newPara,$prepay_id){
  $secondSignArray = array(
   "appid"=>$newPara['appid'],
   "noncestr"=>$newPara['nonce_str'],
   "package"=>"Sign=WXPay",
   "prepayid"=>$prepay_id,
   "partnerid"=>$newPara['mch_id'],
   "timestamp"=>$newPara['timeStamp'],
  );
  $stringA = self::getSignContent($secondSignArray);
  $stringSignTemp=$stringA."&key="192006250b4c09247ec02edce69f6a2d";
  return strtoupper(MD5($stringSignTemp));
 }

Dos puntos a tener en cuenta:

1.La firma secundaria debe completarse en el backend y, una vez completada, toda la información utilizada para la firma secundaria debe transmitirse al frontend para que el frontend pueda llamar al pago de WeChat. Esto hace que sea menos probable que no se pueda llamar al pago de WeChat.
2.Firmas dos veces, se utiliza una cadena de caracteres aleatoria diferente.

Esto es todo el contenido del artículo, espero que sea útil para su aprendizaje y que todos nos apoyen en el tutorial de alarido.

Declaración: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha contribuido y subido por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha procesado editorialmente por humanos y no asume responsabilidades legales relacionadas. Si encuentra contenido sospechoso de infracción de derechos de autor, le invitamos a enviar un correo electrónico a: notice#w3Declaración: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha contribuido y subido por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha procesado editorialmente por humanos y no asume responsabilidades legales relacionadas. Si encuentra contenido sospechoso de infracción de derechos de autor, le invitamos a enviar un correo electrónico a: notice#w

Te gustará