Falando em WeChat Pay, acredito que todos estão familiarizados com isso, mas quando queremos concluir este programa, como nossos programadores devem escrever e configurá -lo? Hoje não se preocupe, o editor do novo canal de tecnologia do bug trouxe um exemplo, vamos ao artigo a seguir para saber mais!
Introdução: distribuidor, como retirar dinheiro dos negócios do WeChat?
Pague diretamente com o WeChat.
A implementação é a seguinte:
Configuração do pagamento do WeChat
/*Pagamento WeChat*/'Pay_weixin' => Array ('Appid' => 'xxxx', 'AppSecret' => 'xxxxxx,' mChid '=>' 1283301801 ', // Número do comerciante' key '' '' '' ZhudianBaodianBahudianBa ', // Merchant Number' key '' '' '' '' 'ZhudianBaodianBahudianBa', // Número do Merchant '»' '' '' ' '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 para xml*/function Arraytoxml ($ arr) {$ xml = "<xml>"; foreach ($ arr como $ key => $ val) {if (is_numeric ($ val)) {$ xml. = "<". $ key. ">". $ val. "</". $ key. ">" } else $ xml. = "<". $ key. "> <! [CDATA [". $ val. "]]> </". } $ xml. = "</xml>"; retornar $ xml;}Use o certificado para enviar o XML para o URL da interface correspondente na postagem
/*** Função: use um certificado para enviar XML ao URL da interface correspondente*/função postxmlssslcurl ($ xml, $ url, $ segundo, $ cert, $ key) {$ ch = curl_init (); // Tempo de tempo limite Curl_SESTOPT ($ CH, Curlopt_timeout, $ Second? $ Second: $ this-> Timeout); // Defina o proxy aqui, se houver um // curl_setopt ($ CH, Curlopt_proxy, '8.8.8.8'); // curl_setopt ($ CH, Curlopt_proxyport, 8080); curl_setot ($ CH, Curlopt_url, $ url); Curl_SESTOPT ($ CH, Curlopt_ssSl_verifyPeer, false); Curl_SESTOPT ($ CH, Curlopt_ssl_verifyHost, false); // Definir cabeçalho curl_setopt ($ CH, Curlopt_header, false); // Defina o resultado como uma string e saída para a tela Curl_SESTOPT ($ CH, Curlopt_ReturntRansfer, true); // Defina o certificado // Use o certificado: certificado e chave pertencem a dois arquivos .PEM, respectivamente, // o formato padrão é PEM, você pode anotar Curl_SESTOPT ($ CH, Curlopt_SslCertType, 'PEM'); Curl_SESTOPT ($ CH, Curlopt_SslCert, $ cert); // O formato padrão é PEM, você pode anotar Curl_SESTOPT ($ CH, Curlopt_ssSlkeyType, 'PEM'); Curl_SESTOPT ($ CH, Curlopt_ssSlkey, $ key); // o método de envio de postagem Curl_SESTOPT ($ CH, Curlopt_Post, true); Curl_SESTOPT ($ CH, Curlopt_Postfields, $ XML); $ data = curl_exec ($ ch); // Retornar resultado se ($ data) {curl_close ($ ch); retornar $ this-> xmltoArray ($ dados); } else {$ error = curl_errno ($ ch); echo "Erro de enrolamento, código de erro: $ error". "<br>"; curl_close ($ ch); retornar falso; }}As empresas pagam indivíduos
// A empresa paga a função pública individual PayTouser ($ params, $ key, $ apcent_cert, $ apiclient_key) {$ url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; // Detecção necessária parâmetros if ($ params ["parceiro_trade_no"] == null) {// exit ("Reembolso da interface do aplicativo, os parâmetros necessários parceiros_trade_no!". "<br>"); } elseif ($ params ["OpenId"] == null) {exit ("interface do aplicativo de reembolso, os parâmetros necessários OpenId!". "<br>"); } elseif ($ params ["check_name"] == null) {// no_check: nenhum nome de nome de nome real force_check: forte verificação do nome real (usuários sem autenticação de nome real falhará em verificar e o transferência não é transferido) option_check: apenas os usuários que não têm nome real são autenticados (que não são transferidos, que não são transferidos), o que não é transferido), que não é transferido, o que não é transferido), que não é transferido, não é transferido, que não é transferido, que não é transferido, que não é transferido, que não é transferido, que não é transferido, que não é transferido, que não é transferido, que não é transferido, que não é transferido, que não é transferido, que não é transferido, que não é transferido, que não é transferido, que não é transferido, que não é transferido, que não é transferido. interface, o parâmetro exigido Check_name está faltando! "." <br> "); } elseif (($ params ["check_name"] == 'force_check' ou $ params ["check_name"] == 'option_check') && ($ params ["re_user_name"] == null)) {// o nome real do usuário do pagamento. EXIT ("Interface do aplicativo de reembolso, o parâmetro necessário re_user_name está faltando!". "<br>"); } elseif ($ params ["valor"] == null) {exit ("interface do aplicativo de reembolso, a quantidade de parâmetro necessária está ausente!". "<br>"); } elseif ($ params ["desc"] == null) {exit ("Reembolso da interface do aplicativo, o parâmetro necessário desc!". "<br>"); } $ params ["mch_appid"] = $ this-> Appid; // ID da conta pública $ params ["mchid"] = $ this-> mchid; // Número do comerciante $ params ["nonce_str"] = $ this-> createNoCest (); // string Randoms ['REMBILL_IPRETEL_IP'] = $; ? '192.127.1.1': $ _server ['remote_addr']; // get ip $ params ["signo"] = $ this-> getSign ($ params, $ key); // assinatura $ xml = $ this-> Arraytoxml ($ params); Retornar $ this-> postxmlssslcurl ($ xml, $ url, false, $ apcent_cert, $ apiclient_key);}Pagamento comercial
função privada _enterprisePay (número de $, $ membro_id, $ valor, $ desc) {// obtém o OpenID $ wxuser_id = m ('membro')-> where (array ('id' => $ membro_id))-> getfield ('wxuser_id'); $ openId = m ('wxUser')-> where (Array ('id' => $ wxuser_id))-> getfield ('OpenId'); $ pay = c ('pay_weixin'); importação ('@. Action.wxdevelo'); $ Enterprise = New Wxenterprise ($ PAY ['APPID'], $ PAY ['APPSECRET'], $ PAY ['MCHID']); $ params = Array ('parceiro_trade_no' => $ número, 'OpenId' => $ OpenId, 'check_name' => 'no_check', 'valor' => $ valor, // total 'desc' => $ desc,); $ resultado = $ Enterprise-> PayTouser ($ params, $ pay ['key'], $ pay ['apiclient_cert'], $ pay ['apiclient_key']); Retornar $ resultado;}Retiradas do distribuidor de processos
Função privada _Handle ($ Truename, $ price) {// manipulam retirada do distribuidor $ retirta = date ("ymdhis"). strval (Rand (1000, 9999)); $ data = Array ('retirada' => $ retirta, 'store_id' => $ this-> store_id, 'membro_id' => $ this-> membro_id, 'truename' => $ truename, 'preço' => $ preço, 'addtime' => time ()); // sem auditoria if ($ preço> = c ('retirt_uncheck_value')) {$ data ['need_check'] = 0; $ data ['status'] = 1; if ($ this-> retirwmodel-> add ($ data)) {$ resultado = $ this-> _ EnterprisePay ($ retirada, $ this-> membro_id, $ preço * 100, 'distribuição ('. $ truename. ') retirada'); // Após um erro nas informações de pagamento, ele precisa ser revisado se ($ resultado ['return_code']! = 'Succcess') {$ this-> retirtwmodel-> where (array ('retirta' => $ retirta))-> salvar (Array ('Need_check' => 1, 'status' => 0)); $ this-> atribui ('sucesso', 2); } else {// Defina o número da transação weChat $ this-> retirtwmodel-> where (Array ('retirada' => $ retirtwd))-> salvar (Array ('pagamento_no' => $ resultado ['pagamento_no'])); //Increase commission flow, to be fixed $data = array('store_id' => $this->store_id, 'user_type' => 2, 'user_id' => $this->shop_id, 'trade_type' => 2, 'trade_no' => $withdrawid, 'price' => -$price, 'status'=> 1, 'message' => $truename.'Cash withdrawal', 'addtime' => time ()); M ('twitter_log')-> add ($ dados); // reduz as comissões correspondentes m ('membro')-> where (Array ('id' => $ this-> membro_id))-> setinc ('dinheiro',-$ price); $ this-> atribui ('sucesso', 1); // envia mensagens de alteração da comissão importar ('@. Action.tmplmsg'); $ tmplmsg = new tmplmsg (); $ tmplmsg-> send (tmplmsg :: price_change, $ this-> membro_id, Array ('token' => $ this-> token, 'introdução' => 'transferência de retirada da comissão de distribuição', 'preço' => $ preço, 'negócios' => negócios)); }} else {$ this-> error ('Erro de informação de retirada em dinheiro!'); }} // A revisão é necessária mais {$ this-> retirtawmodel-> add ($ data); $ this-> atribui ('sucesso', 2); }}Fornece a função das empresas a pagar aos usuários, suporta empresas para pagar através da interface da API ou operar o pagamento através da função da web da plataforma do comerciante de pagamento do WeChat.
Dicas gentis:
◆ Pagar ao mesmo usuário de nome real, o limite diário de uma única transação é 2W/2W
◆ Pagamento ao mesmo usuário não real, com uma única transação e um único limite diário de 2000/2000
◆ O limite total de pagamento para um comerciante no mesmo dia é 100W
◆ Somente Appids que foram vinculados ao número do comerciante são suportados;
◆ Para os usuários -alvo de pagamento, os usuários que foram autenticados pelo WeChat Pay podem fornecer a função de verificar seus nomes reais. Os usuários que não se autenticam por nomes reais não podem verificar. As empresas podem escolher o tipo de verificação com base no nível de segurança de seus próprios negócios;
◆ O valor do pagamento deve ser menor ou igual ao valor atualmente disponível para o comerciante;
◆ Para registros pagos, as empresas podem visualizar os dados correspondentes através da consulta de pagamento corporativo.
Chegada
Os fundos de pagamento inserirão a alteração do usuário alvo (WeChat-i-Wallet-change). O WeChat Pay fará uma notificação de alteração na conta e os detalhes da receita e das despesas de mudança serão exibidos.
Dicas gentis:
Para a versão histórica do cliente da conta de alteração, os fundos inserirão a conta do Red Envelope do usuário e o WeChat Pay notificará os usuários sem nenhuma mensagem, e as empresas podem optar por alcançar os usuários sozinhos.
Link da interface: https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers
É um certificado necessário
Um certificado de duas vias é necessário para uma solicitação.
Exemplo de dados:
<xml> <mch_appid> wxe062425f740c30d8 </mch_appid> <mchid> 10000098 </mchid> <Nonce_Str> 3pg2J4iltKCH16CQ2502SI8ZNMT M67VS </Nonce_Str> <matory_trade_no> 100000982014120919616 </parceiro_trade_no> <penseId> oho4gt7wvpxit1a9gjfamymiz Y1s </pensed> <chench_name> option_check </ceck_name> <ring_user_name> zhang san </r_user_name> <palping> 100 </pum> <cesc> feliz Férias!
Exemplo de sucesso:
<xml> <rort_code> <! [CDATA [success]]> </rort_code> <lorpT_msg> <! [CDATA []]> </rort_msg> <mch_appid> <! [CDATA [wxec38b8ff840 bd989]]> </mch_appid> <mchid> <! [CDATA [10013274]]> </mchid> <posity_info> <! [CDATA []]> </device_info> <Nonce_Str> <! [CDATA [lxudzmnr jpcxzxxlx0q]]> </conce_str> <resultado_code> <! [CDATA [SUCCESS]> </Ilt_Code> <Partner_trade_NO> <! [CDATA [100135742015051915265824 41]]> </mactor_trade_no> <Payping_No> <! [CDATA [1000018301201505190181489473]]> </paging_no> <dayping_time> <! [CDATA [2015-05-19 15:26:59]]> </paging_time> </xml>
Exemplo de erro:
<xml> <retorn_code> <! [CDATA [FAIL]]> </return_code> <rort_msg> <! [CDATA [System está ocupado, tente novamente Posterior.]
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 a explicação detalhada do método de implementação do pagamento da conta do WeChat Enterprise no PHP descrito neste artigo seja útil para que todos aprendam a programação do PHP. Espero que todos continuem apoiando o novo canal de tecnologia errada!