nodejsはWeChatを実現して小さい取引先を支払ってインターフェイスに入ることを申請します.

9976 ワード

WeChat決済の小さな取引先は、「WeChat決済サービス事業者アシスタント」を通じて(通って)、APIインターフェースを通して(詳細は、マイクロ商家の専用インターフェースドキュメントを参照することができます).
2種類の方式で仕入れた後の取引先は違いがあります.
異なる仕入れ方式における小さな取引先の対比
 
WeChatで送ります
APIインターフェースインサート
お支払い方法
マイクロクレジットでしかお支払いできません.
APIインターフェースでしか入金できません.
入金の種類
カード払いとバーコード払いのみ可能です.
カード決済、スキャン決済、公衆番号決済、手続きのサポート
会計プラットフォーム
「WeChat決済」と「WeChat決済業者アシスタント」で対帳できます.ウェブページ版のサービスプロバイダプラットフォームに登録できません.
アプリ「WeChat決済業者アシスタント」のみで対帳できます.ウェブページ版のサービスプロバイダプラットフォームに登録できません.
その他の違い(さらに理解する必要がある)
 
 
小さいマイクロ商家の場合、名前、証明書情報、銀行カード番号、連絡先などの敏感な情報を暗号化する必要があります.暗号化の前に、敏感な情報をダウンロードして公開鍵を暗号化する必要があります.そして、WeChat支払いの公式が提供する敏感情報暗号化方法に基づいて、敏感情報の暗号化を説明する.説明内容は以下の通りです.
󑧙敏感情報フィールドレベル暗号化の説明
WeChat決済事業者APIは、**HTTPS*を使用して、事業者の要求データとWeChat支払いの応答データを端から端まで保護する.しかし、敏感な情報が含まれているパラメータに対しては、名前、証明書情報、銀行カード番号、連絡先など、**フィールド暗号化*のセキュリティ機構を追加しました.敏感な情報を保護するのはデータの受信者にしか見られません.
󑧙葃はどのように要求データの暗号化を行いますか?
1.WeChat支払いプラットフォーム証明書と対応するプラットフォーム証明書のシリアルナンバーを取得し、具体的な方法は「プラットフォーム証明書ダウンロード説明」を参照してください.2.WeChatを使ってプラットフォーム証明書の公開鍵を支払い、暗号化が必要なパラメータ値に対してRSA暗号化を行う.充填方案は`RSAES-PKCS 1-v 1_を使用する.5`3.暗号化された秘密文は、base 64を使用して符号化された後、要求中の該当パラメータの値とします.
注:フィールドを使って暗号化すると、インターフェースはWeChat支払いプラットフォーム証明書のシリアル番号を要求します.
シシシシシのコード例
以下のコードの例はJAVAプログラムが入力文字列を暗号化する方法を示しています.
`java import java.nio.file.Files;import java.nio.file.Paths;import java.security.KeyFactory;import java.security.PublicKey;import java.security.spec.RSAPublicKey Spec;
import javax.cypto.ipher;
import java.util.Base 64;
public class RSAEncryptDemo{    prvate static final String ALGORITHOM="RSA"
    prvate static final String CIPHERUPROVIDER="SunJCE"    prvate static final String TRANSFORMATIONS=「RSA/ECB/PKCS 1 Padding」
    prvate static final String CHAR_ENCODING=「UTF-8」    prvate static final String PUBLICKu="/path/publickey/file"
    public static byte[]encryptPks 1 padding(PublicKey publicKey,byte[]data)throws Exception{        Cinpher ci=Cinpher.get Instance(TRANSFORMATIONS 1 Paddiing、CIPHERHuPROVIDER)        ci.init(Ciepher.ENCRYPT MODE,publicKey);        return ci.doFinal(data)    }
    prvate static String encodeBase 64(byte[]bytes)throws Exception{        return Base 64.get Engcoder().encodeToStering(bytes)    }
    public static String rsaEngcrypt(String Contott)throws Exception{        final byte[]Public KeyBytes=Files.readAllBytes(Paths.get(PUBLICKUFILENAME);        PublicKey publicKey=KeyFactory.getInstance(RSA).generate Public(new X 509 EncocdedKey Spec)
        return encodeBase 64(encryptPks 1 padding);    }
    public static PublicKey getRSAPublicKey(Big Integer modulus、Big Integer publicExp)throws Exception{        KeyFactory fact=KeyFactory.get Instance(ALGORITHOM)        RSAPublicKey Spec publicKey Spec=new RSAPublicKey Spec(modulus、publicExp)        return fact.generate Public(publicKey Spec)    }
    public static void main(String[]args)throws Exception{        System.out.println("after encrypt:"+rsaEncrypt");    } } ```
nodejsで実装する方法は以下の通りです.
var wpayFieldEncrypt = function(str){
    //str            , :  
	//               ,    5 
	//"serial_no": "1252DF",
	//"effective_time": "2018-08-03T09:01:29+08:00",
	//"expire_time": "2023-08-02T09:01:29+08:00",
	//  wpayGenPkey  ,     《nodejs     API   (  CA  )            ?》
	var RSA_PUBLIC_KEY = '-----BEGIN CERTIFICATE-----
'+ 'MIID8TCCAtmgAwIBAgIUElLfzXjnmcEpHHEqozjajaad+FUwDQYJKoZIhvcNAQEL
'+ 'BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
'+ 'FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
'+ 'Q0EwHhcNMTgwODAzMDEwMTI5WhcNMjMwODAyMDEwMTI5WjCBgjEYMBYGA1UEAwwP
'+ 'VGVucGF53131333333dfd3333333333333333333333333333333333DVQQLDBRU
'+ 'ZW5wYXkuY29tIENBIENlbnRlcjELMAkGA1UEBgwCQ04xEjAQBgNVBAgMCUd1YW5n
'+ 'RG9uZzERMA8G3333333333333333333333333333333GSIb3DQEBAQUAA4IBDwAw
'+ 'ggEKAoIBAQCyDR2trGKjr0NTBBiR1VFs0r3elp0/nOElgOdWxeuUH38y9QFRAfDW
'+ 'FDHal3Vuu1zxOEkVhTIFC7RJQMZ8G+cD8MRIyhfptvDxBugJtfYs5/wre44kK56Z
'+ 'DWoz4S97P0Juw6guN7uGwG95tK/sGC2nmw+WVlENHkE1/OyLetm9LFJiypayToLe
'+ 'Xk12314agjlajgglatjtttaWWWWffaggaljlggggajerrjZtSYiikYr2Upzo7wJi
'+ 'sqqzWF7AxyHsgxWVzx8jkjwCTuH5sd27Jx1rGVN5FgvSBBlnOoBu0fKg1C1uVBLe
'+ '6H35+mQnddddddddddddddddddddddddddddddddddddddddBgNVHRMEAjAAMAsG
'+ 'A1UdDwQEAwIE8DBlBgNVHR8EXjBcMFqgWKBWhlRodHRwOi8vZXZjYS5pdHJ1cy5j
'+ 'b20uY24vcHVibGljL2l0cnVzY3JsP0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFEMzk3
'+ 'NTQ5ODQ2QzAxQzNFOEVCRDIwDQYJKoZIhvcNAQELBQADggEBAE4sBFcGoN7bYG/v
'+ 's4Ly0IP0/EpIPQmlQWS+eRLlgIxT4dIFqwvGoz/xqbigrHw1mXg+KrfMfgB8oDKT
'+ '2LuHNsOiwj7Mg9v4pFa2XAw+yp6UfVezrmxGTjXbX5tNJp3voY+eFSx5ZWTJGpKW
'+ 'FoaJYboW3VIFchBu2w3MMSWPnw0bkM3N5SgcU40zNfRHKYUx9WgfrgDcQZoTz3wS
'+ 'yNoAw2RTSC7aC5fBOLggZM5EqBdgNhBE6YrZo2/EU087hI8VfddijZ7d1Bug0F5I
'+ '6aUGjDxjY4oJ08gr2mWZXpV7lCP0mLElUCuzqxkcXa707VnuTeyl2Ck0b+IN90c3
'+ 'hyOEZEw=
'+ '-----END CERTIFICATE-----' //RSA_PKCS1_OAEP_PADDING var encrypted = crypto.publicEncrypt({key:RSA_PUBLIC_KEY, padding:crypto.constants.RSA_PKCS1_PADDING}, new Buffer(str)).toString('base64'); return encrypted; // , , var buffer2 = new Buffer(encryptedStr, 'base64') var decrypted = crypto.privateDecrypt({key: pcert,padding: crypto.constants.RSA_PKCS1_PADDING},buffer2) //pcert res.send(decrypted.toString("utf8")) //ceshi return ''; }
 
登録申請を提出するインターフェースの書き方は以下の通りです.wxPost関数は、博文「nodejs WeChatが微信を支払い、小微商人登録を申請する時、どのように画像アップロードインターフェースを実現しますか?」を参照してください.
app.get('/uploadXwsh',function(req,res){
	//        (           ,         )
	var sfzzmTp = req.query.sfz1; //         
	var sfzfmTp = req.query.sfz2; //         
	var mddmTp = req.query.md1; //        
	var mddnTp = req.query.md22;//        
	
	var id_card_copy, id_card_national, store_entrance_pic, indoor_pic;
    //         
	uploadMedia(phone, id, sfzzmTp, function(media){
		if(media.indexOf('"code":-1') > 0){
			res.send(iconv.decode(media,'utf-8'));
			return;	
		}
		id_card_copy = media;
        //         
		uploadMedia(phone, id, sfzfmTp , function(media){
			if(media.indexOf('"code":-1') > 0){
				res.send(iconv.decode(media,'utf-8'));
				return;	
			}
			id_card_national = media;
            //        
			uploadMedia(phone, id, mddmTp, function(media){
				if(media.indexOf('"code":-1') > 0){
					res.send(iconv.decode(media,'utf-8'));
					return;	
				}
				store_entrance_pic = media;
                //        
				uploadMedia(phone, id, mddnTp, function(media){
					if(media.indexOf('"code":-1') > 0){
						res.send(iconv.decode(media,'utf-8'));
						return;	
					}
					indoor_pic = media;
                    //          ,         
					var business_code = "              ,                ";
					var id_card_name = wpayFieldEncrypt(req.query.xm);
					var id_card_number = wpayFieldEncrypt(req.query.sfzh);
					var id_card_valid_time = '["' + req.query.yxq1 + '","' + (req.query.yxq2 ? req.query.yxq2 : '  ')  + '"]';
					var account_name = id_card_name;
					var account_bank = req.query.khyh;
					var bank_address_code = req.query.khcs;
					var bank_name = req.query.yhqc;
					var account_number = wpayFieldEncrypt(req.query.yhzh);
					var store_name = req.query.shmc;
					var store_address_code = req.query.mdcs;
					var store_street = req.query.mddz;
					var merchant_shortname = req.query.shmc;
					var service_phone = req.query.tel;
					var business = req.query.jylm;
					var rate = '0.38%';
					var contact = id_card_name;
					var contact_phone = wpayFieldEncrypt(req.query.mb);
					var postObject = {
						version:'2.0',
						cert_sn:'                             ,           API  (  CA  )          ',
						mch_id:'      ',
						nonce_str:'  32      ',
						sign_type:'HMAC-SHA256',
						business_code:business_code,
						id_card_copy:id_card_copy,
						id_card_national:id_card_national,
						id_card_name:id_card_name,
						id_card_number:id_card_number,
						id_card_valid_time:id_card_valid_time,
						account_name:account_name,
						account_bank:account_bank,
						bank_address_code:bank_address_code,
						bank_name:bank_name,
						account_number:account_number,
						store_name:store_name,
						store_address_code:store_address_code,
						store_street:store_street,
						store_entrance_pic:store_entrance_pic,
						indoor_pic:indoor_pic,
						merchant_shortname:merchant_shortname,
						service_phone:service_phone,
						business:business,
						rate:rate,
						contact:contact,
						contact_phone:contact_phone
					};
					wxPost(postObject,{sign_type:"HMAC-SHA256", path:'/applyment/micro/submit'}, function(dat){
						if(getXML(dat, "return_code") != "SUCCESS"){
							res.send('{"code":-1,"msg":"' + getXML(dat, "return_msg")+ '"}')	
							return;
						}
						if(getXML(dat, "result_code") != "SUCCESS"){
							res.send('{"code":-2,"msg":"' + getXML(dat, "err_code_des")+ '"}')	//
							return;
						}	
                        //        ,        ,                ,       “    TO_BE_SIGNED” ,       
						res.send('{"code":1,"apmid":"' + getXML(dat, "applyment_id")+ '"}')	
					});
					
				});				
			});			
		});
	});
});