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

Desenvolvimento da função de pagamento WeChat APP no PHP

Algumas experiências pessoais em desenvolvimento de pagamento WeChat no APP usando PHP

Recentemente, devido às necessidades da empresa, é necessário desenvolver o pagamento WeChat no APP, vi a documentação do WeChat, achei que era bom, não encontrei muitos buracos, os pontos que precisam ser notados não são muitos.

Escrever um documento de notas, como um bloco de notas.

fluxo de pagamento APP

Pode ser visto na imagem acima, o processo que precisa ser notado é um total de3parte;
A primeira parte: chamar a API de pedido, retornar a ordem de pagamento prévia, assinar novamente e retornar a informação (4、5、6、7)
A segunda parte: notificação assíncrona (15、16)
A terceira parte: a decisão final do pagamento
O que mais precisa ser notado é a primeira parte: chamar a API de pedido, retornar a ordem de pagamento prévia, assinar novamente e retornar a informação

Documentação do WeChatHá uma descrição detalhada, aqui não será repetida.

Anexar o meu código, please, apenas algumas mudanças no código e já pode ser usado.

//Função de entrada
function weChatPay(){
   $json = array();
   //Parâmetros obrigatórios para gerar a ordem de pagamento prévia:
   $newPara = array();
   //ID da aplicação
   $newPara["appid"] = "wx2421b1c4370ec43"b";
   //Número do comerciante
   $newPara["mch_id"] = "10000100";
   //Número do dispositivo
   $newPara["device_info"] = "WEB";
   //Stringa casuale, qui si consiglia di utilizzare la funzione per generare
   $newPara["nonce_str"] = "1add1a30ac87aa2db72f57a2375d8fec"
   //Descrição do produto
   $newPara["body"] = "APP pagamento de teste";
   //Número do pedido do comerciante, aqui é o número de pedido interno do comerciante
   $newPara["out_trade_no"] = "1415659990";
   //Valor total
   $newPara["total_fee"] = 1;
   //Endereço IP do terminal
   $newPara["spbill_create_ip"] = $_SERVER["REMOTE_ADDR"];
   //Endereço de notificação, atente para que o url aqui não contenha parâmetros
   $newPara["notify_url"] = "http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php";
   //Tipo de transação
   $newPara["trade_type"] = "APP";
   //Assinatura pela primeira vez
   $newPara["sign"] = produceWeChatSign($newPara);
   //Converta o array para formato xml
   $xmlData = getWeChatXML($newPara);
   //Use o pacote CURL do PHP para enviar dados para a interface de pedidos unificados do WeChat, retornando um prepay_id normal
   $get_data = sendPrePayCurl($xmlData);
   //Faça a verificação do resultado retornado.
   if($get_data['return_code'] == "SUCCESS" && $get_data['result_code'] == "SUCCESS"){
    //Realizar a assinatura secundária com base no resultado retornado pelo pagamento WeChat
    //String aleatória necessária para a assinatura secundária
    $newPara["nonce_str"] = "5K8264ILTKCH16CQ2502SI8ZNMTM67VS";
    //Timestamp necessário para a assinatura secundária
    $newPara['timeStamp'] = time()."";
    //Suplementação de parâmetros restantes para a assinatura secundária
    $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'] = "pré-pagamento concluído";
    //A pré-pagamento foi concluída, execute a lógica interna da sua própria empresa abaixo
    /*****************************/
    return json_encode($json);
   }
   else{
    $json['message'] = $get_data['return_msg'];
   }
  }
  return json_encode($json);
 }
//A função de assinatura pela primeira vez 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;
 }
//Função de assinatura secundária
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));
 }

Dois pontos a serem observados:

1.A assinatura secundária deve ser concluída no backend e, após a conclusão, todas as informações usadas para a assinatura secundária devem ser transmitidas para a frente, para que o frontend ative o pagamento WeChat Pay. Isso torna mais difícil que o pagamento WeChat Pay não possa ser acionado.
2.Assinatura duas vezes, usando strings aleatórias diferentes.

Isso é tudo o que há no artigo, esperamos que ajude na aprendizagem de todos e que todos apoiem o tutorial Yell.

Declaração: O conteúdo deste artigo é extraído da Internet, pertence ao respectivo proprietário, foi contribuído e carregado voluntariamente pelos usuários da Internet, o site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade por questões legais relacionadas. Se você encontrar conteúdo suspeito de violação de direitos autorais, seja bem-vindo a enviar e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar, e forneça provas relevantes. Caso seja confirmado, o site deletará imediatamente o conteúdo suspeito de violação de direitos autorais.)

Você também pode gostar