Автор оригинала: David Wong.
После получения идентификатора предоплаты параметры повторно подписываются и передаются в приложение для инициирования оплаты.
Считается, что многие студенты будут напрямую возвращать результаты на сторону приложения, потому что они видят поле знака в возвращаемых результатах единого заказа. В результате сторона приложения не может настроить микроплатеж. Фактически, данные полей, используемые на стороне приложения, должны быть подписаны “режимом единой подписи”, чтобы получить знак, что и требуется стороне приложения.
Платежное приложение Wechat Payment вызывает единый интерфейс заказа на сервере, и серверу необходимо отказаться от возвращенных данных заказа, прежде чем возвращаться в приложение. Это не очень ясно в документе о разработке, поскольку существуют некоторые совпадения между возвращаемыми данными единого заказа и исходными данными двух подписей.
Класс WxPayResults предоставляется sdk платежной службы Wechat, и в классе предусмотрен метод генерации подписей, то есть подписи результирующего набора. Исходный код выглядит следующим образом:
Возьмите в качестве примера версию PHP и сравните ее с другими языками.
class WxPayResults extends WxPayDataBase
{
/**
* Generate signature-rewrite method
* @param WxPayConfigInterface $config configuration object
* @param bool $needSignType Need to Complete Signtype
*@return signature, this function does not override sign member variables, if you want to set the signature, you need to call SetSign method assignment.
*/
public function MakeSign($config, $needSignType = false)
{
// Signature Step 1: Sort the parameters in dictionary order
ksort($this->values);
$string = $this->ToUrlParams();
// Signature Step 2: Add KEY after string
$string = $string . "&key=" . $config->GetKey();
// Signature Step 3: MD5 Encryption or HMAC-SHA256
if (strlen($this->GetSign()) <= 32) {
// If signatures are less than or equal to 32, use MD5 validation
$string = md5($string);
} else {
// is checked with sha256
$string = hash_hmac("sha256", $string, $config->GetKey());
}
// Signature Step 4: All characters are capitalized
$result = strtoupper($string);
return $result;
}
}Обратите внимание, шаг третий, нам нужно получить знак, чтобы определить, как генерировать знак, есть ли вид курицы, несущей яйца, и короткое замыкание кур-несушек визуально. В параметре “Знак” списка параметров вызова платежа на стороне ПРИЛОЖЕНИЯ есть подсказка: “Примечание: режим подписи должен соответствовать использованию единого единого интерфейса”, поэтому логика здесь заключается в передаче знака, возвращенного из единого единого, для облегчения режима единой подписи. После подписания мы должны использовать реальную подпись, чтобы покрыть “подпись”, используемую для передачи подписи.
В едином интерфейсе процесс создания подписей $obj – > setSign () вызывает $obj – > makeSign (), а затем мы можем добавить подписи к данным запроса с помощью $obj – > getSign (). Однако в классе результирующего набора выполните вызовы Sign get Sign напрямую, чтобы определить, как создавать подписи. Поэтому при подписании результирующего набора необходимо убедиться, что результирующий набор содержит данные поля знака, возвращенные из того же порядка, чтобы результирующий набор соответствовал требованию “Примечание: метод подписи должен соответствовать использованию единого интерфейса в единой среде”.
Таким образом, цель переписывания подписи состоит в том, чтобы убедиться, что подпись второй подписи соответствует подписи единого заказа, и подпись единого заказа передается подписи. Затем WxPayResults вызывает make Sign, который определяет метод подписи для унифицированного заказа.
Унифицированные данные, возвращенные из успешного интерфейса
$uniorder = array ( 'appid' => 'wxd930ea5d5a258f4f',//appid 'device_info' => 'WEB', 'mch_id'=>'1900000109', //merchant ID 'nonce_str' => 'g6OZoULWyliPmiPm', 'prepay_id' => 'wx12143635206473d0a53e80f14278847815', 'result_code' => 'SUCCESS', 'return_code' => 'SUCCESS', 'return_msg' => 'OK', 'sign'=>'E91035CA24EDF115374BD2B4C4F9B419', //Uniform Signature of Order 'trade_type' => 'APP', )
Серверу нужны две подписи данных
Адрес документа: https://pay.weixin.qq.com/wik…
- Страница временно заполняет фиксированное значение
- Noncestr не обязательно должен объединять nonce_str, возвращенный из заказа. Он также может генерировать 32 бита сам по себе.
- Отметка времени может быть сгенерирована сама по себе
- Подпись передает подпись, возвращенную из Унифицированного заказа, чтобы подпись результирующего набора соответствовала подписи Унифицированного заказа (или вы четко знаете, что ваша подпись для результирующего набора совпадает с подписью заказа).
Если мы пишем сами и не используем sdk, мы должны быть правы
Если вы используете sdk, вы также должны передать подпись в данных, возвращенных из унифицированного заказа, классу WxPayResults, что гарантирует согласованность метода подписи.
$uniorder ['appid'], // from the results of the unified order 'partnerid'=> $uniorder ['mch_id'], // from the results of a unified order 'prepay id'=> $uniorder ['prepay_id'], // from the results of the unified order 'sign'=> $uniorder ['sign'], // is used to make the result set signature consistent with the unified single signature. 'package'=>'Sign = WXPay', // Write it yourself 'noncestr'=> WxPayApi:: getNonceStr (); //Write it yourself 'timestamp'=> time (), //write it yourself ); $wxPayResults = new WxPayResults(); // Building WxPayResults Objects $wxPayResults->FromArray($app_result); //True signature coverage of returned data to unify signature schemes $app_result ['sign']= $wxPayResults - > makeSign ($wxPayConfig); // and then update to sign after two signatures // Return to the APP side return $$app_result;
Приложение вызывает оплату Wechat следующим образом
IWXAPI api; PayReq request = new PayReq(); request.appId = "wxd930ea5d5a258f4f"; request.partnerId = "1900000109"; request.prepayId= "1101000000140415649af9fc314aa427",; request.packageValue = "Sign=WXPay"; request.nonceStr= "1101000000140429eb40476f8896f4c9"; request.timeStamp= "1398746574"; request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B"; api.sendReq(request);
Используйте данные, предоставленные сервером, для инициирования запроса на оплату.
Оригинал: “https://developpaper.com/after-obtaining-prepay_id-the-parameters-are-re-signed-and-transmitted-to-app-to-initiate-payment/”