UNPKG

flexbiz-server

Version:

Flexible Server

18 lines (17 loc) 7.22 kB
const controller=require("../controllers/controller"),Ptthanhtoan=global.getModel("ptthanhtoan"),hmacSHA256=require("crypto-js/hmac-sha256"),axios=require("axios"),moment=require("moment"),{executeInTransaction}=require("../libs/sessionContext"),zaloScheam=new Schema({id_app:{type:String,required:!0,maxlength:1024},id_ct:{type:String,required:!0,maxlength:1024},apptransid:String,ma_ct:{type:String,required:!0,uppercase:!0},pt_thanh_toan:{type:String,required:!0},client_ip:{type:String,required:!0}, trang_thai:{type:String,default:"0",enum:["0","1","2"]}});(global.configs||{}).createIndexes&&(zaloScheam.index({id_app:1}),zaloScheam.index({id_ct:1}),zaloScheam.index({apptransid:1}),zaloScheam.index({trang_thai:1}),zaloScheam.index({pt_thanh_toan:1}));const model=mongoose.models.zalo||mongoose.model("zalo",zaloScheam),again_link=`${configs.domain?`https://${configs.domain}`:configs.api_url}/public/payment/again`; model.getInfo=async($id_app$$,$condition$$,$fields$$)=>{$condition$$.id_app=$id_app$$;return new Promise(($resolve$$,$reject$$)=>{model.findOne($condition$$).lean().then($rs$$=>{if(!$rs$$)return $reject$$(Error(`Can't find transaction info, Query: ${JSON.stringify($condition$$)}`));$resolve$$($fields$$?$rs$$[$fields$$]:$rs$$)}).catch($e$$=>{$reject$$($e$$)})})}; model.getConfigs=async($id_app$$,$pt_thanh_toan$$,$_paymentViazalo$$)=>{if(!$pt_thanh_toan$$||!global.mongoose.Types.ObjectId.isValid($pt_thanh_toan$$))return null;$_paymentViazalo$$||=await Ptthanhtoan.getInfo($id_app$$,{_id:$pt_thanh_toan$$});return $_paymentViazalo$$||$_paymentViazalo$$.payment_service==="zalo"?($id_app$$=$_paymentViazalo$$.zalo_configs)&&$id_app$$.endpoint&&$id_app$$.appid&&$id_app$$.key1&&$id_app$$.key2?$id_app$$:($id_app$$=configs.zalo_configs)&&$id_app$$.endpoint&&$id_app$$.appid&& $id_app$$.key1&&$id_app$$.key2?$id_app$$:null:(Logger.error("Phuong thuc thanh toan khong ton tai"),null)}; model.createVirtualPaymentClientURL=async($order$$,$client_ip$$,$_paymentViazalo$$)=>{let $id_app$$=$order$$.id_app,$amount$$=$order$$.amount||$order$$.t_tien||0;if($amount$$<1E3)throw"S\u1ed1 ti\u1ec1n ph\u1ea3i l\u1edbn h\u01a1n ho\u1eb7c b\u1eb1ng 1000 VND";let $zalo_configs$$=await model.getConfigs($id_app$$,$order$$.pt_thanh_toan,$_paymentViazalo$$);if(!$zalo_configs$$)return Logger.error("not found zalo configs"),"";let $apptime$$=(new Date).getTime(),$apptransid$$=moment($apptime$$).format("YYMMDD")+ "_"+$order$$.so_ct,$_zalo$$=new model({id_app:$id_app$$,id_ct:$order$$._id,ma_ct:$order$$.ma_ct,apptransid:$apptransid$$,pt_thanh_toan:$order$$.pt_thanh_toan,client_ip:$client_ip$$||":11"});return new Promise(($resolve$$,$reject$$)=>{$_zalo$$.save(($appid_body_e$$,$embeddata_rs$$)=>{if($appid_body_e$$)return $reject$$(Error($appid_body_e$$.message));$appid_body_e$$=$zalo_configs$$.appid;let $appuser$$=$order$$.user_created;$embeddata_rs$$={request_id:$embeddata_rs$$._id.toString(),redirecturl:`${configs.domain? `https://${configs.domain}`:configs.api_url}/public/${$id_app$$}/zalo/${$embeddata_rs$$._id.toString()}/callback`};let $item$$=$order$$.details.map($d$$=>({ma_vt:$d$$.ma_vt,ten_vt:$d$$.ten_vt,sl_xuat:$d$$.sl_xuat})),$bankcode$$=$zalo_configs$$.bankcode||"",$description$$=$order$$.dien_giai||"Pay with zalo";var $mac_rawSignature$$=$appid_body_e$$+"|"+$apptransid$$+"|"+$appuser$$+"|"+$amount$$+"|"+$apptime$$+"|"+JSON.stringify($embeddata_rs$$)+"|"+JSON.stringify($item$$);$mac_rawSignature$$=hmacSHA256($mac_rawSignature$$, $zalo_configs$$.key1).toString();$appid_body_e$$={amount:$amount$$,appid:$appid_body_e$$,appuser:$appuser$$,apptime:$apptime$$,apptransid:$apptransid$$,embeddata:JSON.stringify($embeddata_rs$$),item:JSON.stringify($item$$),bankcode:$bankcode$$,mac:$mac_rawSignature$$,description:$description$$};axios.post($zalo_configs$$.endpoint,new URLSearchParams($appid_body_e$$)).then($res$$=>{if($res$$.data.returncode!=1)return Logger.error($res$$.data),$reject$$(Error($res$$.data.returnmessage));$resolve$$($res$$.data.orderurl)}).catch($error$$=> {$reject$$($error$$)})})})}; model.handleNotify=async($id_app$$,$callback_data$$,$callback$$)=>{try{const $body_receiver$$=JSON.parse($callback_data$$);let $id_transaction$$=$body_receiver$$.embeddata.request_id;if(!$id_transaction$$)return $callback$$(null,{returncode:9,returnmessage:"Kh\u00f4ng tim th\u1ea5y giao d\u1ecbch n\u00e0y"});const $trans$$=await model.findOne({_id:$id_transaction$$}),$service_configs$$=await model.getConfigs($id_app$$,$trans$$.pt_thanh_toan);if(hmacSHA256($callback_data$$.data,$service_configs$$.key2).toString()!== $body_receiver$$.mac)return $callback$$(null,{returncode:9,returnmessage:"Mac kh\u00f4ng kh\u1edbp"});$callback$$(null,{returncode:1,returnmessage:"Callback h\u1ee3p l\u00fd"})}catch($e$$){Logger.error($e$$),$callback$$(null,{returncode:9,returnmessage:"Kh\u00f4ng th\u1ec3 x\u00e1c th\u1ef1c giao d\u1ecbch"})}}; model.verifyReturnUrl=async($apptransid$jscomp$1_id_app$$,$id_transaction$$)=>{let $_zalo$$=await model.getInfo($apptransid$jscomp$1_id_app$$,{_id:$id_transaction$$}),$zalo_configs$$=await model.getConfigs($apptransid$jscomp$1_id_app$$,$_zalo$$.pt_thanh_toan);if(!$zalo_configs$$)throw"Miss configures for zalo";$apptransid$jscomp$1_id_app$$=$_zalo$$.apptransid;let $appid$$=$zalo_configs$$.appid,$mac$$=hmacSHA256($appid$$+"|"+$apptransid$jscomp$1_id_app$$+"|"+$zalo_configs$$.key1,$zalo_configs$$.key1).toString(), $body$$={appid:$appid$$,apptransid:$apptransid$jscomp$1_id_app$$,mac:$mac$$};return new Promise(($resolve$$,$reject$$)=>{axios.post($zalo_configs$$.endpoint_status,new URLSearchParams($body$$)).then(async $obj_updated$jscomp$1_obj_updated$$=>{const $results$$=$obj_updated$jscomp$1_obj_updated$$.data;$results$$.isSuccess=$results$$.returncode==1;let $_v$$=global.getModel(`${$_zalo$$.ma_ct.toLowerCase()}`);if($results$$.isSuccess)try{await executeInTransaction(async()=>{await model.updateOne({_id:$id_transaction$$}, {trang_thai:$results$$.isSuccess==0?"1":"2"});await $_v$$.updateOne({_id:$_zalo$$.id_ct},{trang_thai:"5"});const $obj_updated$$=await $_v$$.findOne({_id:$_zalo$$.id_ct});let $ctrl$$=global.controllers[$_zalo$$.ma_ct.toUpperCase()];$ctrl$$&&$obj_updated$$&&($ctrl$$.post&&(await controller.asyncPostData($obj_updated$$,$ctrl$$),controller.pushNotification($ctrl$$,$obj_updated$$,"update")),$ctrl$$.handleAfterPayment&&(await $ctrl$$.handleAfterPayment($obj_updated$$),controller.pushNotification($ctrl$$, $obj_updated$$,"payment",null,!1,{title:`Bill ${$obj_updated$$.so_ct} \u0111\u00e3 \u0111\u01b0\u1ee3c thanh to\u00e1n`})),$results$$.result_url=$obj_updated$$.again_link||again_link)})}catch($e$$){Logger.error("[zalo]error update status for voucher",$_zalo$$.ma_ct,$e$$),$obj_updated$jscomp$1_obj_updated$$=await $_v$$.findOne({_id:$_zalo$$.id_ct}),$results$$.result_url=$obj_updated$jscomp$1_obj_updated$$.again_link||again_link}else $obj_updated$jscomp$1_obj_updated$$=await $_v$$.findOne({_id:$_zalo$$.id_ct}), $results$$.result_url=$obj_updated$jscomp$1_obj_updated$$.again_link||again_link;$results$$.result_url=$results$$.result_url||again_link;$results$$.error_url="";$results$$.message=$results$$.returnmessage;$resolve$$($results$$)}).catch($error$$=>{$reject$$($error$$)})})};module.exports=model;