syruppay/token

用于加密SyrupPay支付和颁发AccessToken,以便部署到SyrupPay商户。

v1.1.2 2017-01-18 04:25 UTC

README

定义了시럽페이服务中加盟店认证和数据交换的规范,并为传输过程中进行加密和无损性保证而创建、管理令牌的功能。

改进项目

  1. JWT规范及加密解密复杂性
  2. 시럽페이规范(域名)复杂性
  3. 시럽페이服务流程实现复杂性(Fluent API导向)
  4. 数据传输段实现复杂性

入门

PHP版本

=> PHP 5.2.0

安装

composer (packagist)

"syruppay/token": "v1.1.2"`

用于创建Syrup Pay Token以访问用户信息,如注册、登录、设置等

为使用Syrup Pay用户信息,如注册、设置、登录等功能创建并设置令牌。

代码
// 사용자 로그인, 환경 설정 접근 시 
$builder = new syruppay_token_SyrupPayTokenBuilder();
$token = $builder->of("가맹점 ID")
    ->login()
    ->withMerchantUserId("가맹점의 회원 ID 또는 식별자")
    ->withExtraMerchantUserId("핸드폰과 같이 회원 별 추가 ID 체계가 존재할 경우 입력")
    ->withSsoCredential("SSO 를 발급 받았을 경우 입력")
    ->next()
    ->generateTokenBy("가맹점에게 전달한 비밀키");
    
    
// 회원 가입 시
$builder = new syruppay_token_SyrupPayTokenBuilder();
$token = $builder->of("가맹점 ID")
    ->signUp()
    ->withMerchantUserId("가맹점의 회원 ID 또는 식별자")
    ->withExtraMerchantUserId("핸드폰과 같이 회원 별 추가 ID 체계가 존재할 경우 입력")
    ->withSsoCredential("SSO 를 발급 받았을 경우 입력")
    ->next()
    ->generateTokenBy("가맹점에게 전달한 비밀키");
令牌的结果
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ilx1YWMwMFx1YjlmOVx1YzgxMCBJRCJ9.eyJhdWQiOiJodHRwczpcL1wvcGF5LnN5cnVwLmNvLmtyIiwidHlwIjoiam9zZSIsImlzcyI6Ilx1YWMwMFx1YjlmOVx1YzgxMCBJRCIsImV4cCI6MTQ1NDczMTA0MiwiaWF0IjoxNDU0NzMwNDQyLCJqdGkiOiIyMGEzYzI3NC05YTIyLTQ3ZDUtYmUxMS03ZDJiZWYzOWVhMGMiLCJsb2dpbkluZm8iOnsibWN0VXNlcklkIjoiXHVhYzAwXHViOWY5XHVjODEwXHVjNzU4IFx1ZDY4Y1x1YzZkMCBJRCBcdWI2MTBcdWIyOTQgXHVjMmRkXHViY2M0XHVjNzkwIiwiZXh0cmFVc2VySWQiOiJcdWQ1NzhcdWI0ZGNcdWQzZjBcdWFjZmMgXHVhYzE5XHVjNzc0IFx1ZDY4Y1x1YzZkMCBcdWJjYzQgXHVjZDk0XHVhYzAwIElEIFx1Y2NiNFx1YWNjNFx1YWMwMCBcdWM4NzRcdWM3YWNcdWQ1NjAgXHVhY2JkXHVjNmIwIFx1Yzc4NVx1YjgyNSIsIlNTT0NyZWRlbnRpYWwiOiJTU08gXHViOTdjIFx1YmMxY1x1YWUwOSBcdWJjMWJcdWM1NThcdWM3NDQgXHVhY2JkXHVjNmIwIFx1Yzc4NVx1YjgyNSJ9fQ.b8nQakzSfoAA0PD6FmUbhASLZN3ZYi9M9hvV1AMn_Ow
令牌的内容
{
  "aud": "https://pay.syrup.co.kr",
  "typ": "jose",
  "iss": "가맹점 ID",
  "exp": 1454731042,
  "iat": 1454730442,
  "jti": "20a3c274-9a22-47d5-be11-7d2bef39ea0c",
  "loginInfo": {
    "mctUserId": "가맹점의 회원 ID 또는 식별자",
    "extraUserId": "핸드폰과 같이 회원 별 추가 ID 체계가 존재할 경우 입력",
    "SSOCredential": "SSO 를 발급 받았을 경우 입력"
  }
}

用于授权认证的Syrup Pay Token创建

代码
$builder = new syruppay_token_SyrupPayTokenBuilder();
$token = $builder->of("가맹점 ID")
    ->pay()
    ->withOrderIdOfMerchant("가맹점에서 관리하는 주문 ID")
    ->withProductTitle("제품명")
    ->withProductUrls(array(
        "http://deal.11st.co.kr/product/SellerProductDetail.tmall?method=getSellerProductDetail&prdNo=1122841340",
        "http://deal.11st.co.kr/product/SellerProductDetail.tmall?method=getSellerProductDetail&prdNo=1265508741"
    ))
    ->withLanguageForDisplay(LANGUAGE_KO)
    ->withAmount(50000)
    ->withCurrency(CURRENCY_KRW)
    ->withShippingAddress(new syruppay_token_claims_elements_ShippingAddress("137-332", "서초구 잠원동 하나아파트", "1동 1호", "서울", "", "kr"))
    ->withDeliveryPhoneNumber("01011112222")
    ->withDeliveryName("배송 수신자")
    ->withInstallmentPerCardInformation(new syruppay_token_claims_elements_CardInstallmentInformation("카드구분 코드", "할부정보. ex. NN1;NN2;YY3;YY4;YY5;NH6"))
    ->withBeAbleToExchangeToCash(false)
    ->withPayableRuleWithCard(PAYABLELOCALERULE_ONLY_ALLOWED_KOR)
    ->next()
    ->generateTokenBy("가맹점에게 전달한 비밀키");
令牌的结果
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ilx1YWMwMFx1YjlmOVx1YzgxMCBJRCJ9.eyJhdWQiOiJodHRwczpcL1wvcGF5LnN5cnVwLmNvLmtyIiwidHlwIjoiam9zZSIsImlzcyI6Ilx1YWMwMFx1YjlmOVx1YzgxMCBJRCIsImV4cCI6MTQ1NDc0Mzk0NiwiaWF0IjoxNDU0NzQzMzQ2LCJqdGkiOiJkZGRiNjBjNS1mYjAxLTRlZjMtYmYyNi1hNzM1MDU4MzBmZDAiLCJ0cmFuc2FjdGlvbkluZm8iOnsibWN0VHJhbnNBdXRoSWQiOiJcdWFjMDBcdWI5ZjlcdWM4MTBcdWM1ZDBcdWMxMWMgXHVhZDAwXHViOWFjXHVkNTU4XHViMjk0IFx1YzhmY1x1YmIzOCBJRCIsInBheW1lbnRJbmZvIjp7ImNhcmRJbmZvTGlzdCI6W3siY2FyZENvZGUiOiJcdWNlNzRcdWI0ZGNcdWFkNmNcdWJkODQgXHVjZjU0XHViNGRjIiwibW9udGhseUluc3RhbGxtZW50SW5mbyI6Ilx1ZDU2MFx1YmQ4MFx1YzgxNVx1YmNmNC4gZXguIE5OMTtOTjI7WVkzO1lZNDtZWTU7Tkg2In1dLCJwcm9kdWN0VGl0bGUiOiJcdWM4MWNcdWQ0ODhcdWJhODUiLCJwcm9kdWN0VXJscyI6WyJodHRwOlwvXC9kZWFsLjExc3QuY28ua3JcL3Byb2R1Y3RcL1NlbGxlclByb2R1Y3REZXRhaWwudG1hbGw_bWV0aG9kPWdldFNlbGxlclByb2R1Y3REZXRhaWwmcHJkTm89MTEyMjg0MTM0MCIsImh0dHA6XC9cL2RlYWwuMTFzdC5jby5rclwvcHJvZHVjdFwvU2VsbGVyUHJvZHVjdERldGFpbC50bWFsbD9tZXRob2Q9Z2V0U2VsbGVyUHJvZHVjdERldGFpbCZwcmRObz0xMjY1NTA4NzQxIl0sImxhbmciOiJLTyIsImN1cnJlbmN5Q29kZSI6IktSVyIsInBheW1lbnRBbXQiOjUwMDAwLCJzaGlwcGluZ0FkZHJlc3MiOiJrcnwxMzctMzMyfFx1YzExY1x1Y2QwOFx1YWQ2YyBcdWM3YTBcdWM2ZDBcdWIzZDkgXHVkNTU4XHViMDk4XHVjNTQ0XHVkMzBjXHVkMmI4fDFcdWIzZDkgMVx1ZDYzOHxcdWMxMWNcdWM2Yjh8fCIsImRlbGl2ZXJ5UGhvbmVOdW1iZXIiOiIwMTAxMTExMjIyMiIsImRlbGl2ZXJ5TmFtZSI6Ilx1YmMzMFx1YzFhMSBcdWMyMThcdWMyZTBcdWM3OTAiLCJpc0V4Y2hhbmdlYWJsZSI6ZmFsc2V9LCJwYXltZW50UmVzdHJpY3Rpb25zIjp7ImNhcmRJc3N1ZXJSZWdpb24iOiJBTExPV0VEOktPUiJ9fX0.ysALJkS-BCACFmt__5CasVdSfldasq8uuwUEvkfEl5k
令牌的内容
{
  "aud": "https://pay.syrup.co.kr",
  "typ": "jose",
  "iss": "가맹점 ID",
  "exp": 1454743946,
  "iat": 1454743346,
  "jti": "dddb60c5-fb01-4ef3-bf26-a73505830fd0",
  "transactionInfo": {
    "mctTransAuthId": "가맹점에서 관리하는 주문 ID",
    "paymentInfo": {
      "cardInfoList": [
        {
          "cardCode": "카드구분 코드",
          "monthlyInstallmentInfo": "할부정보. ex. NN1;NN2;YY3;YY4;YY5;NH6"
        }
      ],
      "productTitle": "제품명",
      "productUrls": [
        "http://deal.11st.co.kr/product/SellerProductDetail.tmall?method=getSellerProductDetail&prdNo=1122841340",
        "http://deal.11st.co.kr/product/SellerProductDetail.tmall?method=getSellerProductDetail&prdNo=1265508741"
      ],
      "lang": "KO",
      "currencyCode": "KRW",
      "paymentAmt": 50000,
      "shippingAddress": "kr|137-332|서초구 잠원동 하나아파트|1동 1호|서울||",
      "deliveryPhoneNumber": "01011112222",
      "deliveryName": "배송 수신자",
      "isExchangeable": false
    },
    "paymentRestrictions": {
      "cardIssuerRegion": "ALLOWED:KOR"
    }
  }
}

令牌解密

$token = syruppay_token_SyrupPayTokenBuilder::verify("토큰", "가맹점에게 전달한 비밀키");

注意事项

在需要使用复杂的시럽페이服务功能时,可以嵌套使用。

情况1.不知道是否已经注册시럽페이,但想要进行支付的情况(注册、登录、可支付令牌)
$builder = new syruppay_token_SyrupPayTokenBuilder();
$token = $builder->of("가맹점 ID")
    ->signUp()
    ->withMerchantUserId("가맹점의 회원 ID 또는 식별자")
    ->withExtraMerchantUserId("핸드폰과 같이 회원 별 추가 ID 체계가 존재할 경우 입력") // Optional
    ->next()
    ->pay()
    ->withOrderIdOfMerchant("가맹점에서 관리하는 주문 ID") // 가맹점 Transaction Id = mctTransAuthId
    ->withProductTitle("제품명")
    ->withProductUrls(array(
        "http://deal.11st.co.kr/product/SellerProductDetail.tmall?method=getSellerProductDetail&prdNo=1122841340",
        "http://deal.11st.co.kr/product/SellerProductDetail.tmall?method=getSellerProductDetail&prdNo=1265508741"
    )) // Optional
    ->withLanguageForDisplay(LANGUAGE_KO)
    ->withAmount(50000)
    ->withCurrency(CURRENCY_KRW)
    ->withShippingAddress(new syruppay_token_claims_elements_ShippingAddress("137-332", "서초구 잠원동 하나아파트", "1동 1호", "서울", "", "kr")) // Optional
    ->withDeliveryPhoneNumber("01011112222") // Optional
    ->withDeliveryName("배송 수신자") // Optional
    ->withInstallmentPerCardInformation(new syruppay_token_claims_elements_CardInstallmentInformation("카드구분 코드", "할부정보. ex. NN1;NN2;YY3;YY4;YY5;NH6")) // Optional
    ->withBeAbleToExchangeToCash(false) // Optional
    ->withPayableRuleWithCard(PAYABLELOCALERULE_ONLY_ALLOWED_KOR) // Optional
    ->next()
    ->generateTokenBy("가맹점에게 전달한 비밀키");
情况2.在시럽페이自动登录后进行支付的情况(自动登录、可支付令牌)
$builder = new syruppay_token_SyrupPayTokenBuilder();
$token = $builder->of("가맹점 ID")
    ->login()
    ->withMerchantUserId("가맹점의 회원 ID 또는 식별자")
    ->withExtraMerchantUserId("핸드폰과 같이 회원 별 추가 ID 체계가 존재할 경우 입력") // Optional
    ->withSsoCredential("발급 받은 SSO")
    ->next()
    ->pay()
    ->withOrderIdOfMerchant("가맹점에서 관리하는 주문 ID") // 가맹점 Transaction Id = mctTransAuthId
    ->withProductTitle("제품명")
    ->withProductUrls(array(
        "http://deal.11st.co.kr/product/SellerProductDetail.tmall?method=getSellerProductDetail&prdNo=1122841340",
        "http://deal.11st.co.kr/product/SellerProductDetail.tmall?method=getSellerProductDetail&prdNo=1265508741"
    )) // Optional
    ->withLanguageForDisplay(LANGUAGE_KO)
    ->withAmount(50000)
    ->withCurrency(CURRENCY_KRW)
    ->withShippingAddress(new syruppay_token_claims_elements_ShippingAddress("137-332", "서초구 잠원동 하나아파트", "1동 1호", "서울", "", "kr")) // Optional
    ->withDeliveryPhoneNumber("01011112222") // Optional
    ->withDeliveryName("배송 수신자") // Optional
    ->withInstallmentPerCardInformation(new syruppay_token_claims_elements_CardInstallmentInformation("카드구분 코드", "할부정보. ex. NN1;NN2;YY3;YY4;YY5;NH6")) // Optional
    ->withBeAbleToExchangeToCash(false) // Optional
    ->withPayableRuleWithCard(PAYABLELOCALERULE_ONLY_ALLOWED_KOR) // Optional
    ->withMerchantDefinedValue('{"id_1":"value", "id_2":2}')    // Optional, 1k 제한
    ->next()
    ->generateTokenBy("가맹점에게 전달한 비밀키");

情况4.在시럽페이自动登录后购买定期支付商品的情况(自动登录、自动定期支付可用的令牌)

- 准备中 -

扩展功能

为Syrup Pay用户联接设置Syrup Pay Token

通过Syrup Pay用户信息查询,为Syrup Pay手动登录时自动输入ID等附加功能设置匹配信息并创建令牌。

Java代码
$builder = new syruppay_token_SyrupPayTokenBuilder();
$token = $builder->of("가맹점 ID")
    ->login()
    ->withMerchantUserId("가맹점의 회원 ID 또는 식별자")
    ->withExtraMerchantUserId("핸드폰과 같이 회원 별 추가 ID 체계가 존재할 경우 입력")
    ->withSsoCredential("SSO 를 발급 받았을 경우 입력")
    ->next()
    ->mapToSyrupPayUser()
    ->withType(MAPPINGTYPE_CI_MAPPED_KEY)
    ->withValue("4987234")
    ->next()
    ->generateTokenBy("가맹점에게 전달한 비밀키");
令牌的结果
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ilx1YWMwMFx1YjlmOVx1YzgxMCBJRCJ9.eyJhdWQiOiJodHRwczpcL1wvcGF5LnN5cnVwLmNvLmtyIiwidHlwIjoiam9zZSIsImlzcyI6Ilx1YWMwMFx1YjlmOVx1YzgxMCBJRCIsImV4cCI6MTQ1NDc0NDkyNCwiaWF0IjoxNDU0NzQ0MzI0LCJqdGkiOiIzZjllYzM3ZS1mMTUwLTQ0YmUtYWVlYy04NzgyZDlkNTM3YjciLCJsb2dpbkluZm8iOnsibWN0VXNlcklkIjoiXHVhYzAwXHViOWY5XHVjODEwXHVjNzU4IFx1ZDY4Y1x1YzZkMCBJRCBcdWI2MTBcdWIyOTQgXHVjMmRkXHViY2M0XHVjNzkwIiwiZXh0cmFVc2VySWQiOiJcdWQ1NzhcdWI0ZGNcdWQzZjBcdWFjZmMgXHVhYzE5XHVjNzc0IFx1ZDY4Y1x1YzZkMCBcdWJjYzQgXHVjZDk0XHVhYzAwIElEIFx1Y2NiNFx1YWNjNFx1YWMwMCBcdWM4NzRcdWM3YWNcdWQ1NjAgXHVhY2JkXHVjNmIwIFx1Yzc4NVx1YjgyNSIsIlNTT0NyZWRlbnRpYWwiOiJTU08gXHViOTdjIFx1YmMxY1x1YWUwOSBcdWJjMWJcdWM1NThcdWM3NDQgXHVhY2JkXHVjNmIwIFx1Yzc4NVx1YjgyNSJ9LCJ1c2VySW5mb01hcHBlciI6eyJtYXBwaW5nVHlwZSI6IkNJX01BUFBFRF9LRVkiLCJtYXBwaW5nVmFsdWUiOiI0OTg3MjM0In19.DaBLUtyRzdRRDg7Z2lU0v65myvfuFD08qo-gz9UfeR0
令牌的内容
{
  "aud": "https://pay.syrup.co.kr",
  "typ": "jose",
  "iss": "가맹점 ID",
  "exp": 1454744924,
  "iat": 1454744324,
  "jti": "3f9ec37e-f150-44be-aeec-8782d9d537b7",
  "loginInfo": {
    "mctUserId": "가맹점의 회원 ID 또는 식별자",
    "extraUserId": "핸드폰과 같이 회원 별 추가 ID 체계가 존재할 경우 입력",
    "SSOCredential": "SSO 를 발급 받았을 경우 입력"
  },
  "userInfoMapper": {
    "mappingType": "CI_MAPPED_KEY",
    "mappingValue": "4987234"
  }
}

注意事项

在需要使用复杂的시럽페이服务功能时,可以嵌套使用。

情况1.
情况2.

使用시럽페이结账功能

为加盟店的优惠券、用户会员、用户的收货地址等订单相关信息和现有시럽페이的简便支付使用更便捷的시럽페이的扩展功能

注意

为支持优惠券(Offer)和会员积分(Loyalty)的复合支付,使用该服务需要预先协商阶段。

使用시럽페이结账生成令牌以同时进行结账认证和优惠券(Offer)支付

- 准备中 -

使用시럽페이结账生成令牌以同时进行结账认证和会员积分(Loyalty)支付

- 准备中 -

使用시럽페이结账生成令牌以同时进行结账认证和收货地址信息支付

- 准备中 -

注意

  1. 一旦创建了一个SyrupPayTokenBuilder,就不能再次使用它来构建另一个令牌或重新构建JSON。
  2. 可以根据用户方便输入内容(Claim)后创建令牌,但对于必需的字段,如果没有输入,则在生成令牌时(在调用SyrupPayTokenHandler#generateTokenBy(key)时)可以抛出InvalidArgumentException。
  3. 令牌创建后的有效期设置为10分钟,如果需要修改,必须遵循与Syrup Pay开发团队协商后提供的指南。

参考资料

  1. JOSE RFC - https://tools.ietf.org/wg/jose
  2. Syrup Pay JOSE - https://github.com/skplanet/jose_php
  3. JWT IO - https://jwt.net.cn/