Hablando de WeChat Pay, creo que todos están familiarizados con él, pero cuando queremos completar este programa, ¿cómo deberían nuestros programadores escribirlo y configurarlo? No se preocupe, hoy el editor del nuevo canal de tecnología del error le ha traído un ejemplo, ¡vamos al siguiente artículo para obtener más información!
Introducción: Distribuidor, ¿Cómo retirar efectivo de WeChat Business?
Pague directamente con WeChat.
La implementación es la siguiente:
Configuración de pago de WeChat
/*Wechat payling*/'pay_weixin' => array ('appid' => 'xxxx', 'appSecret' => 'xxxxxxx,' mchid '=>' 1283301801 ', // numero' key '=>' zhududaodiandiAzHudiandanBao0527 ', // comerciante clave' apeCert ' 'Conf/cert/apiclient_cert.pem', // certificado de comerciante apiclient_cert.pem 'apiclient_key' => 'conf/cert/apiclient_key.pem', // certificado de comerciante apiclient_key.pem)arraytoxml
/*** Array a xml*/function ArrayToxml ($ arr) {$ xml = "<xml>"; foreach ($ arr as $ key => $ val) {if (is_numeric ($ val)) {$ xml. = "<". $ key. ">". $ val. "</". $ key. ">"; } else $ xml. = "<". $ Key. "> <! [Cdata [". $ Val. "]> </". $ Key. ">"; } $ xml. = "</xml>"; devolver $ xml;}Use el certificado para enviar el XML a la URL de la interfaz correspondiente en la publicación
/*** Función: use un certificado para enviar XML a la URL de la interfaz correspondiente*/function postXMLSSLCURL ($ xml, $ url, $ segundo, $ cert, $ key) {$ ch = curl_init (); // tiempo de tiempo de espera curl_setopt ($ ch, curlopt_timeout, $ segundo? $ Segundo: $ this-> timeout); // Establezca el proxy aquí, si hay uno // curl_setopt ($ ch, curlopt_proxy, '8.8.8.8'); // curl_setopt ($ ch, curlopt_proxyport, 8080); curl_setopt ($ ch, curlopt_url, $ url); curl_setopt ($ ch, curlopt_ssl_verifypeer, falso); curl_setopt ($ ch, curlopt_ssl_verifyhost, falso); // establecer el encabezado curl_setopt ($ ch, curlopt_header, falso); // Establezca el resultado como una cadena y salida en la pantalla curl_setopt ($ ch, curlopt_returntransfer, true); // Establecer el certificado // Use el certificado: cert y clave pertenece a dos archivos .pem respectivamente // El formato predeterminado es PEM, puede anotar curl_setopt ($ ch, curlopt_sslcerttype, 'pem'); curl_setopt ($ ch, curlopt_sslcert, $ cert); // El formato predeterminado es PEM, puede anotar curl_setopt ($ ch, curlopt_sslkeytype, 'pem'); curl_setopt ($ ch, curlopt_sslkey, $ key); // El método de envío de publicaciones curl_setopt ($ ch, curlopt_post, true); curl_setopt ($ ch, curlopt_postfields, $ xml); $ data = curl_exec ($ ch); // devuelve el resultado if ($ data) {curl_close ($ ch); devolver $ this-> xmltoarray ($ data); } else {$ error = curl_errno ($ ch); echo "Error curl, código de error: $ error". "<br>"; curl_close ($ ch); devolver falso; }}Las empresas pagan a las personas
// La empresa paga la función pública individual PayTouser ($ params, $ key, $ apcent_cert, $ apiclient_key) {$ url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; // Detección de parámetros requeridos if ($ params ["socio_trade_no"] == null) {// exit ("Interfaz de aplicación de reembolso, los parámetros requeridos socios_trade_no!". "<br>"); } elseif ($ params ["OpenId"] == NULL) {EXIT ("Interfaz de aplicación de reembolso, los parámetros requeridos OpenID!". "<br>"); } elseif ($ params ["check_name"] == null) {// no_check: sin verificación de nombre real Force_check: verificación fuerte del nombre real (los usuarios sin autenticación de nombre real no podrán verificar, y la transferencia no se puede transferir) opción_check: solo los usuarios que tienen los usuarios reales autenticados son verificados (los usuarios que no tienen el nombre real autenticado no verificar, la transferencia se puede ser verificando sucesivamente el nombre). Interfaz, falta el parámetro requerido check_name! "." <br> "); } elseif (($ params ["check_name"] == 'force_check' o $ params ["check_name"] == 'option_check') && ($ params ["re_user_name"] == null)) {// el nombre real del usuario de pago. Exit ("Interfaz de aplicación de reembolso, falta el parámetro requerido re_user_name!". "<br>"); } elseif ($ params ["cantidad"] == null) {salida ("Interfaz de aplicación de reembolso, la cantidad de parámetro requerida falta!". "<br>"); } elseif ($ params ["DESC"] == NULL) {EXIT ("Interfaz de aplicación de reembolso, el parámetro requerido DESC!". "<br>"); } $ params ["mch_appid"] = $ this-> appid; // ID de cuenta pública $ params ["mChid"] = $ this-> mchid; // comerciante número $ params ["nonce_str"] = $ this-> createenCestr (); // string $ params ['spbill_create_ip'] = $ _server ['' '' '' '' '' '' '192.127.1.1': $ _server ['remoto_addr']; // Obtener ip $ params ["firmar"] = $ this-> getSign ($ params, $ key); // firma $ xml = $ this-> arraytoxml ($ params); return $ this-> postxmlsslcurl ($ xml, $ url, falso, $ apcent_cert, $ apiclient_key);}Pago de negocios
función privada _enterprisepay ($ number, $ member_id, $ cantidad, $ desc) {// Obtenga OpenID $ wxuser_id = m ('member')-> where (array ('id' => $ member_id))-> getField ('wxuser_id'); $ OpenID = M ('Wxuser')-> Where (Array ('id' => $ wxuser_id))-> getField ('OpenId'); $ pay = c ('pay_weixin'); import ('@. Action.wxDeVelop'); $ Enterprise = new WxenterPrise ($ Pay ['Appid'], $ Pay ['AppSecret'], $ Pay ['mChid']); $ params = array ('socio_trade_no' => $ number, 'openId' => $ openID, 'check_name' => 'no_check', 'cantidad' => $ monta, // total 'desc' => $ desc,); $ result = $ Enterprise-> PayTouser ($ Params, $ Pay ['Key'], $ Pay ['apiclient_cert'], $ pay ['apiclient_key']); devolver $ resultado;}Retiros del distribuidor de procesos
Función privada _handle ($ TrUename, $ Price) {// Manejo del retiro del distribuidor $ retrawid = date ("ymdhis"). strval (rand (1000, 9999)); $ data = array ('retrawid' => $ retrawid, 'store_id' => $ this-> store_id, 'member_id' => $ this-> member_id, 'trUename' => $ truename, 'precio' => $ precio, 'addtime' => time ()); // sin auditoría if ($ precio> = c ('retiros_uncheck_value')) {$ data ['Need_check'] = 0; $ data ['status'] = 1; if ($ this-> retrawModel-> add ($ data)) {$ resultado = $ this-> _ Enterprisepay ($ retiros // Después de un error en la información de pago, debe revisarse si ($ result ['return_code']! = 'Éxito') {$ this-> retiros $ this-> asigne ('éxito', 2); } else {// establecer el número de transacción WeChat $ this-> retiros // Aumentar el flujo de la Comisión, para que se solucione $ data = array ('store_id' => $ this-> store_id, 'user_type' => 2, 'user_id' => $ this-> store_id, 'trade_type' => 2, 'trade_no' => $ retirarse, 'precio' =>-$ '»=> 1,' mensaje '=> $ trate 'addtime' => time ()); M ('twitter_log')-> add ($ data); // reduce las comisiones correspondientes m ('miembro')-> donde (array ('id' => $ this-> member_id))-> setinc ('dinero',-$ precio); $ this-> asigne ('éxito', 1); // Enviar mensajes de cambio de comisión import ('@. Action.tmplmsg'); $ tmplmsg = new tmplmsg (); $ tmplmsg-> send (tmplmsg :: precio_change, $ this-> member_id, array ('token' => $ this-> token, 'intro' => 'transferencia de retiro de la comisión de distribución', 'precio' => $ precio, 'negocios' => negocios)); }} else {$ this-> error ('¡Error de información de retiro de efectivo!'); }} // Se requiere una revisión más {$ this-> retirarsemodel-> add ($ data); $ this-> asigne ('éxito', 2); }}Proporciona la función de las empresas para pagar a los usuarios, admite que las empresas pagan a través de la interfaz API o operan el pago a través de la función web de la plataforma de comerciante de pagos de WeChat.
Consejos amables:
◆ Pague al mismo usuario de nombre real, el límite diario para una sola transacción es 2W/2W
◆ Pago al mismo usuario no real, con una sola transacción y un solo límite diario de 2000/2000
◆ El límite de pago total para un comerciante el mismo día es de 100W
◆ Solo se admiten las aplicaciones que han estado vinculadas al número de comerciante;
◆ Para los usuarios objetivo de pago, los usuarios que han sido autenticados por WeChat Pay pueden proporcionar la función de verificar sus nombres reales. Los usuarios que no se han autenticado con nombres reales no pueden verificar. Las empresas pueden elegir el tipo de verificación basado en el nivel de seguridad de su propio negocio;
◆ El monto del pago debe ser menor o igual a la cantidad disponible actualmente para el comerciante;
◆ Para los registros pagados, las empresas pueden ver los datos correspondientes a través de la consulta de pago de la empresa.
Llegada
Los fondos de pago ingresarán al cambio del usuario objetivo (WeChat-I-Wallet-Change). WeChat Pay hará una notificación de cambio en la cuenta, y se mostrarán los detalles de ingresos y gastos de cambio.
Consejos amables:
Para la versión histórica del cliente de la cuenta de cambio, los fondos ingresarán a la cuenta Red sobre del usuario, y WeChat Pay notificará a los usuarios sin ningún mensaje, y las empresas pueden optar por llegar a los usuarios por sí mismos.
Enlace de la interfaz: https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers
Se requiere un certificado
Se requiere un certificado bidireccional para una solicitud.
Ejemplo de datos:
<XML> <MCH_APPID> WXE062425F740C30D8 </MCH_APPID> <MCHID> 10000098 </MCHID> <NINCE_STR> 3PG2J4ILTKCH16CQ2502SI8ZNMT M67VS </nonce_str> <socio_trade_no> 100000982014120919616 </socio_trade_no> <enenid> oho4gt7wvpxit1a9gjfamymiz Y1S </arrenID> <CHECK_NAME> OPTION_CHECK </CHECK_NAME> <RE_USER_NAME> ZHANG SAN </R_USER_NAME> <nistios> 100 </monta> <Edc> feliz Holiday! </descrano> <spbill_create_ip> 10.2.3.10 </spbill_create_ip> <girm> c97bdbacf37622775366f38b629f45e3 </sign> </xml>
Ejemplo exitoso:
<xml> <surne_code> <! [CDATA [Success]]> </return_code> <surne_msg> <! [CDATA []]> </shure_msg> <mch_appid> <! [CDATA [WXEC38B8FF840 bd989]]> </mch_appid> <mchid> <! [CDATA [10013274]]> </mchid> <vice_info> <! [CDATA []]> </dome_info> <nonce_str> <! [CDATA [LXUDZMNR jpcxzxlx0q]]> </nence_str> <resultado_code> <! [Cdata [éxito]]> </result_code> <jandro_trade_no> <! [CDATA [100135742015051915265824 41]]> </socio_trade_no> <paging_no> <! [CDATA [1000018301201505190181489473]]> </pay_no> <paypage_time> <! [CDATA [2015-05-19 15:26:59]]> </pay_time> </xml>
Ejemplo de error:
<xml> <surne_code> <! [Cdata [fail]]> </shurn_code> <surne_msg> <! [CDATA [System está ocupado, intente nuevamente Más tarde.]]> </return_msg> <resultado_code> <! [Cdata [fail]]> </ resultado_code> <rr_code> <! [CDATA [SystemError]]>> </err_code> <rig_code_des> <! [CDATA [System está ocupado, por favor, intente nuevamente más tarde.
For more information about PHP related content, please check out the topics of this site: "Summary of PHP WeChat Development Skills", "Summary of PHP encoding and transcoding operation techniques", "Summary of PHP network programming techniques", "Introduction to PHP basic syntax tutorial", "Summary of php string usage", "Introduction to PHP database operation tutorial" and "Summary of common php database operation técnicas "
Espero que la explicación detallada del método para implementar el pago de la cuenta de WeChat Enterprise en PHP descrito en este artículo sea útil para todos para aprender la programación de PHP. ¡Espero que todos continúen apoyando el nuevo canal de tecnología incorrecto!