В этой статье в основном объясняется процесс стыковки среды Sandbox Alipay и генерирует платежный QR-код. Мой уровень ограничен. Если есть какая-либо неуправляемость, я надеюсь указать, спасибо
1. Войдите в платформу разработки Alipay.
1. Найдите разработку Alipay
2. Войти
3. Войдите в среду песочницы
Основная информация о среде песочницы
Вы можете нажать и посмотреть, чтобы увидеть, что в целом, вы будете использовать его позже
В инструменте Sandbox есть версия программного обеспечения Alipay Sandbox, которое можно загрузить на свой мобильный телефон. Номер учетной записи и пароль находятся в учетной записи Sandbox.
Установить открытый ключ
В основном установите открытый ключ приложения
Если нет, вы можете нажать на инструкции Alipay, там есть подробные шаги
4. Скачать демо
Нажмите «Обзор Центра разработчиков».
Правильная загрузка SDK
Alipay обеспечивает много тестовой демонстрации, которое можно использовать напрямую.
найти лицом к лицу
скачать
2. Получите платежный QR-код
1. Откройте тестовую демонстрацию
2. Измените файл конфигурации
В проекте есть файл конфигурации zfbinfo.properties, который содержит важную информацию о конфигурации в стыковке.
Просто выберите необходимые поля здесь
#网管修改为dev
open_api_domain=https://openapi.alipaydev.com/gateway.do
#沙箱账号中,商户的UID,这个为收钱商户的ID
pid = 2088102178032752
#沙箱应用中,appid
appid = 2016100100635726
# RSA私钥、公钥和支付宝公钥
private_key = 支付宝公私钥软件生成的公钥
public_key = 支付宝公私钥软件生成的私钥的pkcs8版
#其他字段根据个人需求修改
3. Основной класс
используется в основном методеmain.test_trade_precreate();
способ генерации QR-кода
мы можем изменитьmain.test_trade_precreate();
Содержимое в методе для настройки информации
1) Путь строки 435 может быть установлен как локальный путь, и путь генерируется для изображения
String filePath = String.format("C:/Users/bai/Desktop/qr-%s.png",response.getOutTradeNo());
//这行代码的注释打开,用来生成图片到我们的路径下
ZxingUtils.getQRCodeImge(response.getQrCode(), 256, filePath);
2) 423 – это URL-адрес интерфейса обратного вызова. После того, как пользователь отсканирует код и платеж будет успешным, Alipay получит обратный вызов соответственно. Два обратных вызова вызывают этот интерфейс, о чем можно судить по полю статуса. Есть поле пояснения в сообщении JSON.
.setNotifyUrl("外网可访问的支付宝回调URL")
3) Другая информация может быть настроена в соответствии с примечаниями и личными потребностями.
После изменения информации запустите main напрямую, чтобы сгенерировать изображение QR-кода по указанному пути.
4. Четыре сообщения JSON
Получите JSON, отправленный QR-кодом:
//获取二维码发出的json
{
//必填,订单号,64个字符以内,字母数字下划线
"out_trade_no": "tradeprecreate15647279763334241735",
"seller_id": "", //收款支付宝ID,如为空,按支付宝开发应用配置中的pid使用
"total_amount": "100", //必填,总金额(打折前)
"undiscountable_amount": "0", //不打折金额(实际付款金额),选填,默认为总金额-打折金额
"subject": "xxx品牌xxx门店当面付扫码消费", //必填,订单标题
"body": "购买商品3件共20.00元", //订单描述
//商品信息
"goods_detail": [{
"goods_id": "goods_id001",
"goods_name": "xxx小面包",
"quantity": 1,
"price": "10"
}, {
"goods_id": "goods_id002", //商品ID
"goods_name": "xxx牙刷", //商品名
"quantity": 2, //数量
"price": "5" //单价
}],
"operator_id": "test_operator_id", //商户操作员编号,可以用来做销售统计,选填
"store_id": "test_store_id", //必填,商户门店编号
//自定义参数,回调时会带回,目前只支持sys_service_provider_id
"extend_params": {
"sys_service_provider_id": "2088100200300400500"
},
//过期时间
"timeout_express": "120m"
}
Получите JSON ответа QR-кода:
//支付宝响应响应
{
"alipay_trade_precreate_response": {
"code": "10000", //其他错误的状态码可以去支付宝官网查看
"msg": "Success",
"out_trade_no": "tradeprecreate15647279763334241735",
//图片
"qr_code": "https:\/\/qr.alipay.com\/bax03381xcn7dw89lcih007e"
},
"sign": "hFNh5JIlUR9rY42ModDoCj/7CA/05cHUq5fI/XaWGRpVAxR3i8tGjTa7XQpvNZEpGd04D/vI5KF/9QfDV7nH5MGNAR/JQA2fkHrevvbfiBV1O+aKzBIZel4BRTNDTrTH1k+DxWE7nn2Ei54DDwnuk47l8bKhMM4jA6fFCcu/oimcybvMdQV/HyHqssiIph/0OiorFMrOebIKPieAGF7+XksIa1OrSSRCCsjYxh2c7vIHFLCDU1rlSpL8e8USl0bkMy5XX+qCn967aQVet+ejy4eMSYZ2PFNGY3HlgAESX2PEhfDd8opmED3xWSzSzLJUW2RRisjwkR0Pjz8AXe0fGA=="
}
Пользователь сканирует код для обратного вызова JSON:
//扫码后
{
"gmt_create": ["2019-08-02 14:39:53"], //订单创建时间
"charset": ["utf-8"],
"seller_email": ["rxfxed9950@sandbox.com"], //售货员邮箱,沙箱账户中信息
"notify_time": ["2019-08-02 14:39:54"], //通知时间
"subject": ["xxx品牌xxx门店当面付扫码消费"], //标题
//签名
"sign": ["OiXtXYPpQx2siDhBJiKYyEpYYd1NULnt1pKAP+MGJHaya8bIFzHcx3GdQLMmj3MPL+jKimMd2+lMVNCfvxjXvYLLfyHe3TrxECI1vGuS3ROREz0xwl6vQemZnBVgphGGulAVYsmzVyBq3L0mfGwPgFgAVnU63iK874l1C57hlsGZTetkyEKcBWPgOchNKciHDTLgzuaEQnhn37JYJbAm1SZB5hGc4HxHsKWEvdmfu+dzU7uE0WdBTs76V1xG8lyMeKjcUjah4NAsxbp0HRvli5lWiCEXt30eIJZJAEcgraL/lrpmb0p7AabLixbsT+P/ibF4pEWByXX7lzkYa/+aGA=="],
"body": ["购买商品3件共20.00元"], //订单详情
"buyer_id": ["2088102178090170"], //买主ID
"version": ["1.0"], //版本
"notify_id": ["2019080200222143954090171000498739"], //通知ID
"notify_type": ["trade_status_sync"], //通知类型
"out_trade_no": ["tradeprecreate15647279763334241735"], //订单号
"total_amount": ["100.00"], //总价格
"trade_status": ["WAIT_BUYER_PAY"], //交易状态
"trade_no": ["2019080222001490171000065035"], //交易编号
"auth_app_id": ["2016100100635726"], //app ID
"buyer_logon_id": ["kdl***@sandbox.com"], //买主登录ID
"app_id": ["2016100100635726"], //app—ID
"sign_type": ["RSA2"], //签名类型
"seller_id": ["2088102178032752"] //商户UID,支付宝开发中信息
}
Обратный вызов платежа пользователя JSON:
//支付成功后
{
"gmt_create": ["2019-08-02 14:39:53"],
"charset": ["utf-8"],
"seller_email": ["rxfxed9950@sandbox.com"],
"subject": ["xxx品牌xxx门店当面付扫码消费"],
"sign": ["UBHEmHSVGHz3e/sPYx0wEe7n2jRKVBFiraQdfwp49ElD3XqWemOtk6xFpj1wlVzElOCov9V/RWJr+Xhw98A9yxybtWboFBOCg3oyUXdftLDhUD3gFkUVoGyB70LvPeIG5qzo84/zcrr/F/JqTuiFXzuG7CYpzg1g/H6K2Be7X+cT+9xsvT4llkZB2mso0pkWTXFoR0kG8OrjuYdaBo0yKIFWIn6JYGxsyrX1jn/hj/v6VthKIf17u/bSVxZUcZO/asgjqd2v1wweELJsyvSz7pwW0R+bqKRvZ+wLGsV9r3LQC6TQecQIP4adFlfdVAWPJ981einnk+F2+0u38K3WCg=="],
"body": ["购买商品3件共20.00元"],
"buyer_id": ["2088102178090170"],
"notify_id": ["2019080200222144027090171000500200"],
"total_amount": ["100.00"],
"app_id": ["2016100100635726"],
"sign_type": ["RSA2"],
"buyer_logon_id": ["kdl***@sandbox.com"],
"seller_id": ["2088102178032752"],
"version": ["1.0"],
"out_trade_no": ["tradeprecreate15647279763334241735"],
"trade_no": ["2019080222001490171000065035"],
"auth_app_id": ["2016100100635726"],
//---------------以上是扫码后同有的数据
"notify_time": ["2019-08-02 14:40:27"], //通知时间
"gmt_payment": ["2019-08-02 14:40:26"], //支付时间
"trade_status": ["TRADE_SUCCESS"], //支付状态,成功
"buyer_pay_amount": ["100.00"], //买方花费金额
"invoice_amount": ["100.00"], //发票金额
"fund_bill_list": ["[{\"amount\":\"100.00\",\"fundChannel\":\"ALIPAYACCOUNT\"}]"],
"receipt_amount": ["100.00"],
"point_amount": ["0.00"] //优惠价格
}
5. Интерфейс обратного вызова
Интерфейс обратного вызова должен быть доступен для внешней сети, а для проникновения во внутреннюю сеть можно использовать скорлупу арахиса.
Чтобы создать службу, доступную из внешней сети, я использую SpringBoot для ее быстрой сборки, или вы можете напрямую использовать веб-проект для ее запуска в Tomcat.
@RestControllerpublic
class WebController {
@PostMapping("/")
public String receive(ZfbRequestBean zfbRequestBean) {
System.out.println(zfbRequestBean);
return "hello";
}
}
Используйте ZfbRequestBean для получения запрошенных данных, все атрибуты соответствуют приведенному выше сообщению JSON.
Аннотация @Data — это Lombok, очень удобный плагин IDEA, который может автоматически генерировать методы getter, setter, toString.Я не буду здесь слишком много объяснять.Если вы не используете его, вы можете добавить методы getter и setter самостоятельно.
@Data
public class ZfbRequestBean {
private String gmt_create;
private String charset;
private String seller_email;
private String subject;
private String sign;
private String body;
private String buyer_id;
private BigDecimal invoice_amount;
private String notify_id;
private String fund_bill_list;
private String notify_type;
private String trade_status;
private BigDecimal receipt_amount;
private BigDecimal buyer_pay_amount;
private String app_id;
private String sign_type;
private String seller_id;
private String gmt_payment;
private String notify_time;
private String version;
private String out_trade_no;
private BigDecimal total_amount;
private String trade_no;
private String auth_app_id;
private String buyer_logon_id;
private BigDecimal point_amount;
}
Когда пользователь сканирует код и платит, этот интерфейс будет вызываться Alipay.
Поле fund_bill_list специальное, это строка JSON, конвертации здесь нет, конвертировать можно самостоятельно
3. Дополнение
1. Веб-версия Демо
В тестовом проекте есть каталог веб-приложений, вы можете настроить Tomcat самостоятельно, запустить index.html и иметь хорошую стыковку версии страницы.
Нужно изменить несколько вещей
Скопируйте файл конфигурации zfbinfo.properties в папку web-inf
Строка 31 файла trade_precreate.jsp изменена на Configs.init("../zfbinfo.properties");
Если вам нужно протестировать другие интерфейсы, путь необходимо изменить
Вот личное решение, если есть лучшее, вы можете обсудить его в комментариях.
2. Другие интерфейсы
Метод Main подключается к другим интерфейсам в WebAPP, можете попробовать сами, все аналогично