1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/tedi-wxpay

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

##Все еще есть проблемы, это тестовый код ##На основе интерфейса оплаты через WeChat на node.js Я только начал изучать node.js, в коде, вероятно, много недостатков, пожалуйста, дайте мне больше советов.

QQ:85920312 Email:tedi3231@qq.com

####WeChat предлагает три способа оплаты:

  • Оплата через публичный аккаунт Этот сценарий в основном ориентирован на пользователей с публичным аккаунтом, у продавца есть H5-сайт магазина, и пользователи могут совершать покупки на странице и оплачивать через WeChat.
  • Сканирование кода для оплаты Продавец создает разные QR-коды для разных товаров в соответствии с правилами WeChat Pay, которые используются для сканирования и покупки пользователями. Например, его можно использовать как способ оплаты при интеграции платежей WeChat на веб-сайте PC.
  • Платёж по карте Это не было глубоко изучено, но оплата через WeChat, используемая в таких магазинах, как «Пятёрочка», относится к этому методу.

####Этот интерфейс, помимо реализации оплаты через публичные аккаунты и сканирования кода, также предоставляет следующие функции:

  • Корпоративные платежи Предоставляет возможность корпоративным клиентам платить пользователям. Компания может осуществлять платежи через API-интерфейс или через веб-платформу WeChat Pay для продавцов.
  • Денежные красные конверты Пока не реализовано.
  • Подарочные карты или скидки Пока не реализовано.

####Основные инструкции по использованию платёжного интерфейса

######Проблемы, возникшие при разработке WeChat Pay, суммированы следующим образом:

  1. Официальные документы недостаточно подробны, например, параметры отправляются в формате XML, а не JSON, возвращаемое значение также является XML, а не JSON, что поначалу сбивало с толку.
  2. Генерация подписи на самом деле не так уж и сложна, но важно отметить, что параметры строго различаются по размеру, а параметры со значением null не участвуют в расчёте.
  3. Получение различных токенов и билетов может вызвать путаницу, плюс несоответствие параметров между передней и задней частью может привести к сбоям.
  4. Многие студенты не смогли успешно выполнить вызов, потому что на публичной платформе не были правильно настроены параметры разработки для оплаты через публичные аккаунты, особенно каталог разрешений на оплату. Если он не настроен правильно, оплата может быть неудачной.
  5. Во время тестирования некоторые студенты жестко кодируют openid, включая меня. При самостоятельной оплате проблем нет, но когда другие пытаются заплатить, им постоянно предлагается привязать банковскую карту.

######Инициализация интерфейса

var config = {
    appid:"XXXX", //идентификатор публичного аккаунта
    mch_id:"XXX",   //идентификатор продавца
    partner_key:"XXX", //это ключ API, будьте осторожны, он должен состоять из 32 символов, многие ошибки возникают из-за неправильной настройки этого параметра
    cert:"certs/apiclient_cert.pem",    //если вам нужны такие функции, как возврат средств, корпоративные платежи и т.д., сертификат необходим, необходимо установить оба этих параметра
    cert_key:"certs/apiclient_key.pem"
};
var api = new require("./index")(config);

Большинство функций в интерфейсе возвращают promise, поэтому используйте следующий метод записи:

api.function1(параметр).then(функция(данные){
    //код после успешного вызова
}).fail(функция(ошибка){
    //Код после неудачного вызова
});

Примечание

Следующие параметры интерфейса отображаются как необязательные для установки:

  • appid
  • mch_id
  • nonce_str
  • sign

######Создание единого заказа За исключением сценария оплаты путём сканирования, система продавца сначала вызывает этот интерфейс для создания предоплаченного торгового ордера в бэкенде WeChat Pay и возвращает правильный идентификатор предварительно оплаченного торгового разговора. Затем, в зависимости от сценария (сканирование, JSAPI, APP и т. д.), генерируется строка транзакции для запуска платежа. Дополнительные параметры см. в документации WeChat Developer.

function test_unifiedorder(){
    var order_item = {
        notify_url:"http://wedo.avosapps.com/order/aa.php",
        openid:"opmukt4SZzas_TinMqpT5JkC3z6Q",
        out_trade_no:Number.parseInt(Math.random()*1000000),//пожалуйста, убедитесь, что он уникален в вашей бизнес-системе, обычно это номер заказа
        spbill_create_ip:"14.23.150.211",
        total_fee:1,            //единица измерения здесь - цзяо
        trade_type:"NATIVE",    //может быть JSAPI (при вызове JSSDK для оплаты в общедоступном аккаунте), NATIVE (этот тип при сканировании на веб-странице) или APP
        body:"aavv"             //описание товара
    };
    api.unifiedorder(order_item).then(функция(данные){
        console.log(данные);
    }).fail(функция(ошибка){
        console.log(ошибка);
    });
}
test_unifiedorder();

######Просмотр заказа Этот интерфейс позволяет просматривать все заказы WeChat Pay. Продавец может активно проверять статус заказа через этот интерфейс и реализовывать последующую бизнес-логику. Необходимость вызова интерфейса просмотра заказов:

  • Когда в системе продавца, сети, сервере и т. д. возникают исключения, система продавца не получает платёжное уведомление в конце;
  • После вызова платёжного интерфейса возвращается системная ошибка или неизвестный статус транзакции;
  • При вызове API оплаты путём сканирования возвращается статус USERPAYING;
  • Перед вызовом API закрытия или отмены заказа необходимо подтвердить статус платежа;

Для конкретных параметров и возвращаемых значений, пожалуйста, обратитесь к документации WeChat Developer. Здесь можно просмотреть только одну запись и выполнить пакетный просмотр на основе номера заказа WeChat или номера заказа продавца. Можно указать один из двух параметров: либо номер заказа WeChat, либо номер заказа продавца.

var params = {transaction_id:"1005450053201511261776573190"};
//var params = {out_trade_no:"239023900392"};
api.orderquery(params).then(функция(данные){
    console.log(данные);
}).fail(функция(ошибка){
    console.log(ошибка);
});

######Закрытие заказа Необходимо вызвать интерфейс закрытия заказа в следующих случаях: если заказ продавца не удаётся оплатить, необходимо создать новый номер заказа и инициировать новую оплату, исходный номер заказа должен быть закрыт, чтобы избежать повторной оплаты; после того, как система разместит заказ, если платёж пользователя истекает, система выходит из системы и больше не обрабатывает его, чтобы предотвратить продолжение оплаты пользователем, необходимо вызвать интерфейс закрытия заказа.

Обратите внимание: после создания заказа должно пройти не менее 5 минут, прежде чем можно будет закрыть заказ.

Для конкретных параметров и возвращаемых значений, пожалуйста, обратитесь к документации WeChat Developer. Параметр — это номер заказа продавца.

var params = {out_trade_no:"35370664"};
api.closeorder(params).then(функция(данные){
    console.log(данные);
}).fail(функция(ошибка){
    console.log(ошибка);
});

######Запрос возврата Продавец может вернуть платеж покупателю через определённый период времени после совершения транзакции по причинам, связанным с покупателем или продавцом. После получения запроса на возврат и успешной проверки WeChat Pay вернёт платеж на счёт покупателя в соответствии с правилами возврата. Примечания:

  1. Заказы, выполненные более года назад, не подлежат возврату.
  2. WeChat Pay поддерживает возврат средств за одну транзакцию несколько раз. Для многократного возврата требуется указать номер заказа продавца исходной транзакции и установить другой номер возврата. Если возврат не удался с первой попытки, повторно отправьте тот же номер возврата. Общая сумма возврата не может превышать фактическую сумму платежа пользователя. Обратите внимание: после создания заказа должно пройти не менее 5 минут, прежде чем можно будет запросить возврат.

Для конкретных параметров и возвращаемых значений, пожалуйста, обратитесь к документации WeChat Developer.

    var params = {
        device_info:"WEB",
        transaction_id:"1005270053201511261778229445",
        out_refund_no:"REFUND0001",
        total_fee:1,
        refund_fee:1,
        refund_fee_type:"CNY",
        op_user_id:"1289247501"
    };  
    api.refund(params).then(функция(данные){
        console.log("данные о возврате ", данные);
    }).fail(функция(ошибка){
        console.log("ошибка возврата",ошибка);
    });

######Проверка возврата После подачи заявки на возврат вы можете проверить статус возврата, вызвав этот интерфейс. Возврат средств занимает некоторое время: возврат средств с помощью наличных происходит в течение 20 минут, а возврат средств с банковского счёта — в течение трёх рабочих дней. Пожалуйста, обратитесь к документации WeChat Developer для конкретных параметров и возвращаемых значений.

var params = { ```
{
    "device_info": "WEB",
    "transaction_id": "1005270053201511261778229445",
    "out_refund_no": "REFUND0001"
}

api.refund(params).then(function(data){ console.log("refundquery data is ", data); }).fail(function(err){ console.log("refundquery erro is",err); });

Корпоративные платежи

Корпоративные платежи основаны на функции управления финансами в рамках платформы для продавцов WeChat Pay. Эта функция предназначена для того, чтобы помочь продавцам удобно осуществлять корпоративные платежи физическим лицам. Она предоставляется для некоторых продавцов, имеющих возможности разработки, и позволяет выполнять корпоративные платежи через API. Например, в настоящее время в страховой отрасли осуществляются выплаты клиентам при возврате страховых взносов, выплатах и урегулировании убытков. Для корпоративных платежей будет использоваться доступный баланс продавца, поэтому необходимо убедиться, что доступный баланс достаточен. Для просмотра доступного баланса, пополнения счёта и снятия наличных средств, пожалуйста, войдите в систему «Управление финансами» на платформе продавца (https://pay.weixin.qq.com/). Примечание: корпоративные платёжные средства не хранятся на том же счёте, что и средства, полученные через WeChat Pay, их необходимо пополнять отдельно. Требуется двусторонний сертификат. Подробные сведения о конкретных параметрах и возвращаемых значениях см. в документации по разработке WeChat.

var params = {
        "device_info": "mac",
        "partner_trade_no": "202143344343",
        "openid": "opmukt4SZzas_TinMqpT5JkC3z6Q",
        "check_name": "NO_CHECK",
        "amount": 101,
        "desc": "Урегулирование убытков",
        "spbill_create_ip": "192.168.0.1"
};
api.company_transfers(params).then(function(data){
    console.log("company_transfers data",data);
}).fail(function(err){
    console.log("Company transfers error",err);
});
Запрос корпоративных платежей

Используется для запроса результатов операции корпоративных платежей продавца. Возвращает подробные результаты операции платежа. Подробные сведения о конкретных параметрах и возвращаемых значениях см. в документации WeChat по разработке.

var params = {
    "partner_trade_no":"202143344343"
};  
api.company_get_transfers(params).then(function(data){
    console.log("company_get_transfers data",data); 
}).fail(function(err){
    console.log("Company get transfers error",err);
});

Оплата через официальный аккаунт


Основной процесс оплаты через официальный аккаунт выглядит следующим образом: Пользователь переходит на страницу официального аккаунта --> размещает заказ --> система бизнеса создаёт заказ --> вызывается интерфейс унифицированного заказа WeChat --> возвращается информация о предоплаченном заказе prepay_id --> создаётся объект, который будет вызываться на стороне клиента JS, и подписывается --> вызываются элементы управления оплатой WeChat --> отображается страница продавца с сообщением об успешной покупке. Конкретный процесс можно посмотреть на этом рисунке: image

  1. Создание заказа в системе бизнеса Этот шаг может быть выполнен или после вызова интерфейса унифицированного заказа WeChat, то есть это заказ в локальной системе бизнеса. Мы сначала следуем первому способу, который выполняется перед вызовом интерфейса унифицированного заказа.

  2. Интерфейс унифицированного заказа WeChat Во всех трёх способах оплаты WeChat необходимо сначала вызвать интерфейс унифицированного заказа, чтобы создать предварительный заказ на стороне WeChat. Здесь следует отметить, что этот предварительный заказ не появится в списке заказов на платформе продавца. Код для отправки предварительного заказа выглядит следующим образом:

var order_item = {
    notify_url:"http://wedo.avosapps.com/order/succ",
    openid:"opmukt4SZzas_TinMqpT5JkC3z6Q",
    out_trade_no:Number.parseInt(Math.random()*1000000),
    spbill_create_ip:"14.23.150.211",
    total_fee:1,
    trade_type:"JSAPI",
    body:"aavv"
};
api.unifiedorder(order_item).then(function(data){
    console.log(data);
}).fail(function(err){
    console.log(err);
});

Примечания:

  • openid — это openid текущего пользователя в этом официальном аккаунте;
  • out_trade_no, если система бизнеса вызывается первой, должен быть номером заказа в системе бизнеса;
  • trade_type здесь должен быть «JSAPI»;
  • конкретные параметры см. в официальной документации WeChat (https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1).
  1. Генерация prepay_id, создание объекта, вызываемого на стороне клиента JS, и подписание Используйте пример кода WEB в express, код на стороне клиента выглядит следующим образом, пожалуйста, поместите следующий код в тег script и обратитесь к JSSDK «http://res.wx.qq.com/open/js/jweixin-1.0.0.js»: ``` router.get("/pay/order2",function(req,res,next){ var item = {title:"order",message:"demo"}; var signURL = "http://" + req.hostname + req.url ; mywx.get_ticket(signURL).then(function(jsapi_ticket){ //console.log("get_ticket result is ", jsapi_ticket ); var ret = helper.get_ticket_sign(jsapi_ticket,signURL); //console.log("ret is ",ret); ret.title = "Wechat pay"; ret.message = "hwhahaha"; var order_item = { notify_url:"http://wedo.avosapps.com/pay/succ", openid:req.session.openid, out_trade_no:Number.parseInt(Math.random()*100000000), spbill_create_ip:"0.0.0.0",//req.connection.remoteAddress, total_fee:1, trade_type:"JSAPI", body:"hahahah" }; payapi.unifiedorder(order_item).then(function(data){ console.log("unifiedorder data is ",data); ret.pay_item = data; console.log("ret is %s",ret); res.render("order",ret); }).fail(function(err){ console.log(err); next(); }); }); });

**注意点:**
* 因为需要调用JSSDK,所以需要在每个需要调用JSSDK的页面获取TICKET信息,具体请参看jssdk的调用设置;另外对于 token和ticket的获取提供了另外一个模块wxapi.js文件,其中有ticket和token的获取的方法。此模块功能还不完善,仅供参考。

4. 调用微信支付控件,输入密码,付款成功
### 扫码支付

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Интерфейс оплаты через WeChat Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/tedi-wxpay.git
git@api.gitlife.ru:oschina-mirror/tedi-wxpay.git
oschina-mirror
tedi-wxpay
tedi-wxpay
master