Cómo utilizar PHP para implementar el pago WeChat, por favor avise.
¡Novato! Explica en detalle
Pago JSAPI de la cuenta pública de WeChat
1: Parámetros de configuración
Después de que la aplicación sea exitosa, obtenga el archivo de interfaz y coloque todos los archivos en el directorio raíz del proyecto weixin. Complete la información de la cuenta de configuración en WxPay.ub.config.php;
2: Establecer autorización
Centro de desarrolladores->Servicio web->Autorización web Obtener información básica del usuario->. Modificar;
"Simplemente cambie el nombre de dominio de la página de devolución de llamada de autorización a la dirección de su nombre de dominio. Debe asegurarse de que se haya obtenido la autorización de la página web; de lo contrario, se informará un error en el parámetro de redirección_uri;
Tres: autorización de la página web para obtener openid del usuario
Cambios en el archivo de solicitud js_api_call.php (todos los parámetros pasados a WeChat se reciben en el archivo de entrada)
$out_trade_no = $_GET['out_trade_no']; //Sistema comercial El número de pedido interno debe tener menos de 32 caracteres
$total_fee = $_GET['total_fee']*100; centavos y no puede contener puntos decimales, por lo que el precio debe multiplicarse por 100. p>
De lo contrario, se informará un error al obtener prepay_id (es mejor configurar el campo monto en 2 decimales)
$pay_status = get_pay_status($out_trade_no);//Ver el estado de pago del pedido
p>$return_url = get_return_url($out_trade_no); //Configurar la página a la que saltar después del pago exitoso p>
//Usar la interfaz jsapi
$jsApi = new JsApi_pub();
//Obtener openid a través del código
if (!isset( $_GET['code'])) { //Activa WeChat para devolver el código
//Establece el parámetro redirección_uri y devuelve la dirección del código. De hecho, redirige a la página actual y obtiene el código de usuario. parámetro
$url = WxPayConf_pub::JS_API_CALL_URL."?showwxpaytitle=1&out_trade_no=$out_trade_no&total_fee=$total_fee" ;
$url = $jsApi->createOauthUrlForCode($url);
Header("Ubicación: $url");
}else{ // Obtener el código para obtener el openid
$code = $_GET[' code'];
$jsApi->setCode($code);
$ openid = $jsApi->getOpenId() //ID de usuario
}
Luego está el método createOauthUrlForCode($redirectUrl) bajo la clase JsApi_pub() del archivo WxPayHubHelper.php, los segundos parámetros
Cambie a $urlObj["redirect_uri"] = urlencode($redirectUrl); //Codifica en URL la variable $url, de lo contrario h
El número de pedido y el monto no se pueden obtener cuando se redirige al lector.
Cuatro: establezca los parámetros de la interfaz de pago unificada y obtenga prepay_id (ID de prepago generado por WeChat, utilizado en llamadas de interfaz posteriores)
Pago de WeChat->Configuración de desarrollo->Prueba de pago->Directorio de autorización de prueba y adición de lista blanca de prueba
(El directorio de autorización de pago debe ser exacto al directorio más detallado y, al usarlo, el directorio Agregue el nombre del archivo directamente después del nombre, como ccc.com/weixin/)
Asegúrese de que el método getPrepayId de la clase UnifiedOrder_pub en su archivo WxPayPubHelper.php se pueda usar normalmente
Depuración en este paso Puedes ver el código de error en var_dump($this->result); en getPrepayId();
El método createXml se llama después del método posXml
function postXml() {
$xml = $this->createXml();
//**Compruebe aquí si el archivo xml se genera normalmente
include_once("log_.php ");
$log = new Log_();
$log->log_result("log.txt",$xml); p>
// ** Dado que la impresión de algunos archivos en formato XML solo muestra la longitud de los caracteres, no el contenido.
Así que lo escribí en forma de registro y lo depuré en el servidor
$this->response = $this->postXmlCurl($xml,$this->url,$this->curl_timeout);
return $this->response;
}
Asegúrese de que el formato de la variable xml sea el siguiente;
PostXmlCurl puede se enviará correctamente solo si los parámetros son correctos. Después de obtener el prepay_id correcto, aparecerá el cuadro de pago
Cinco: use jsapi para activar el pago
Genere parámetros de pago jsapi basados en prepay_id.
$jsApi->setPrepayId ($prepay_id);
$jsApiParameters = $jsApi->getParameters();
//Llamar al pago de la API de WeChat JS
función jsApiCall() {
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
,
función( res){
WeixinJSBridge. log(res.err_msg);
if(res.err_msg == "get_brand_wcpay_request:ok") { //Después del pago exitoso
window.location.href="" // Las direcciones de salto y las operaciones de pedidos también deben procesar pedidos en páginas asíncronas para evitar errores de sincronización
}else{
alert("Error en el pago "+res.err_code+res.err_desc +res.err_msg);
}
}
);
}(El el estado del pedido debe determinarse cada vez que se solicita el método callpay para evitar envíos repetidos)
Seis: la interfaz de notificación universal procesa de forma asincrónica los resultados de devolución de WeChat
Una vez completado el pago, obtenga el Devolución de llamada de WeChat en notify.php
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
// La firma debe verificarse y responderse a WeChat.
if($notify->checkSign() == TRUE) //Después de pasar la verificación de la firma y actualizar el estado del pedido
$notify->setReturnParameter("return_code" ,"SUCCESS" ; p>
//WeChat reiniciará periódicamente las notificaciones mediante ciertas estrategias (como ***8 veces en 30 minutos),
$returnXml = $notify->returnXml ();
echo $returnXml; (devuelve datos xml a WeChat cuando return_code es EXITOSO, no se dará más notificación)
//Cuando reciba una notificación para su procesamiento, primero verifique el estado de los datos comerciales correspondientes y juzgue si la notificación ha sido procesada, si no se ha procesado, procese nuevamente,
Si se ha procesado, devolverá directamente el resultado del éxito. Antes de verificar el estado y procesar los datos comerciales, se deben utilizar bloqueos de datos para el control de concurrencia.
Para evitar la confusión de datos causada por la reentrada de funciones.
//Determine si está navegando en WeChat Abra la función del navegador
isWeiXin(){
var ua = window.navigator.userAgent.toLowerCase();
if(ua.match(/MicroMessenger / i) == 'micromessenger'){
devuelve verdadero;
}else{
devuelve falso;
} p >
}
Los pasos son lo suficientemente detallados. Lo implementé yo mismo, así que escribí un registro y lo combiné con la versión PHP de la demostración para resolverlo aproximadamente. tenga claro todo el proceso, eche un vistazo más de cerca. Después de completar el documento de la interfaz de pago de la cuenta oficial de WeChat, lo tendrá después de solicitar con éxito el pago de la cuenta oficial de WeChat.