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で実装する方法は以下の通りです.
登録申請を提出するインターフェースの書き方は以下の通りです.wxPost関数は、博文「nodejs WeChatが微信を支払い、小微商人登録を申請する時、どのように画像アップロードインターフェースを実現しますか?」を参照してください.
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")+ '"}')
});
});
});
});
});
});